&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]] *検索 [#pba5c11a] **IDで検索 [#wd1c188e] -レコードが存在しない場合例外発生 book = Book.find(999) -レコードが存在しない場合nil。 book = Book.find_by_id(999) *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