- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2016-06-15T15:09:50+09:00","default:wikiwriter","wikiwriter")
&tag(ActiveRecord);
*目次 [#t9585ef4]
#contents
*参考情報 [#xd595ebe]
-[[読書メモ+tips+日記:[Ruby] ActiveRecord を単体で(Railsアプリの外で)使う:http://blog.livedoor.jp/takaaki_bb/archives/50602246.html]]
-[[ActiveRecord を 単独で使う例: katoy: cocolog:http://youichi-kato.cocolog-nifty.com/blog/2008/06/activerecord_0c49.html]]
-[[Active Record クエリインターフェイス | Rails ガイド:http://railsguides.jp/active_record_querying.html]]…ここが一番分かりやすい
*検索 [#pba5c11a]
-[[Rails 4で非推奨になった/なっていないfinderメソッドを整理する - Qiita:http://qiita.com/jnchito/items/2b7d64851665071ed6e6]]
-[[rails/activerecord-deprecated_finders:https://github.com/rails/activerecord-deprecated_finders]]
-dynamic finderが全て非推奨になったわけではない(find_by_nameのような)。
**IDで検索 [#wd1c188e]
-レコードが存在しない場合例外発生
-findを使う。レコードが存在しない場合例外発生
book = Book.find(999)
-レコードが存在しない場合nil。
-find_by_idを使う。レコードが存在しない場合nil。
book = Book.find_by_id(999)
book = Book.find_by_name('おもしろい本')
book = Book.find_by_name!('おもしろい本') #=>例外発生たい場合
-find_by(ハッシュ)を使う。レコードが存在しない場合nil
book = Book.find_by(id: 999)
book = Book.find_by(name: 'おもしろい本')
book = Book.find_by!(name: 'おもしろい本') #=>例外発生させたい場合
**whereで条件指定 [#x0fdb833]
-Are系は存在しない場合空配列となる。firstで先頭要素を取得する。
-whereで検索条件を指定できる
book = Book.where("title=?", title).first
-複数条件を指定する場合
book = Book.where("title=? AND price=?" title, price).first
*保存 [#d162a6c4]
**保存時に検証処理をバイパスする [#yb717c8a]
-saveメソッドに"validate: false"を指定する。
@product.save(validate: false)
*Tips [#za8f7a18]
**保存済みレコードかどうかの確認 [#a1b055eb]
-new_record? 新規データの場合はtrue。
item.new_record?
-persisted?保存済みの場合はtrue。
item.persisted?
**複数のデータベースに接続する [#jdc8bc0c]
-ActiveRecord::Baseを継承したクラスでestablish_connectionをそれぞれ設定する。
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"localhost",:username=>$dbuser,:password=>$dbpasswd,:data\
base=>$olddbname)
end
class Person < ActiveRecord::Base
self.inheritance_column = :old_type
self.establish_connection(:adapter=>"mysql2",:host=>"localhost",:username=>$dbuser,:password=>$dbpasswd,:data\
base=>$newdbname)
end
}}
**type列がエラーになる [#k2b54f44]
-self.inheritance_column = :old_typeのようにして回避する
#pre{{
class OldPerson < ActiveRecord::Base
self.table_name = 'person'
self.inheritance_column = :old_type
end
}}
**大量のINSERTを早くする [#j333ff18]
***バックエンドのDB設定をチューニングする [#efef9ed0]
-MySQLの場合my.cnfでinnodb_buffer_pool_sizeなどをいじる。
#pre{{
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
}}
***transactionを使う [#ub5ccc1e]
-saveなどをActiveRecord::Base.transaction do endで囲むとCOMMIT回数が減らせるので早くなる。
***activerecord-import [#bd26a5c1]
-[[zdennis/activerecord-import · GitHub:https://github.com/zdennis/activerecord-import]]を使う。MySQLの高速化した(圧縮された)INSERT文を生成してくれる。これが一番効果あった。
**SQLを表示する [#x2a1fe33]
-loggerを使う。
#pre{{
require 'logger'
ActiveRecord::Base.logger = Logger.new(STDOUT)
}}
*トラブルシューティング [#i49c62fd]
** 「[deprecated] I18n.enforce_available_locales will default to true in the future」というメッセージ [#gb82f542]
-RailsではなくActiveRecord単体で使った時に表示されるようになった。スクリプトのどこかに以下を追加すればとりあえず回避できる。
I18n.enforce_available_locales = false