#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) -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