Railsレシピブック Recipe 48 - 58
Railsレシピブック Recipe 1 - 17 - maeshimaの日記
Railsレシピブック Recipe 18-28 - maeshimaの日記
Railsレシピブック Recipe 29 - 47 - maeshimaの日記
の続き。ActiveRecord編その1。
find
引数に配列を指定できる。
Blog.find([1,2,3])
new_record?
オブジェクトが未保存ならfalseを返す。レコードが修正されたかとかじゃなくて単純に保存されてるかどうかをチェックしてる。
validationのスキップ
- validationがスキップできるのはsaveメソッドだけ。save!もcreateもcreate!もスキップしない。
- Rails3ではvalidationをスキップするときの引数が変更されてる
save(false) # rails 2 save(:validate => false) # rails 3
createメソッドでブロックをとる
そういやcreateはブロックとれた。attr_accessibleなど定義しているときに使える。
# Create a single object and pass it into a block to set other attributes. User.create(:first_name => 'Jamie') do |u| u.is_admin = false end
createメソッドで複数レコードを保存
createメソッドに配列を渡すと複数レコード生成できるらしい。知らなかった。
# Creating an Array of new objects using a block, where the block is executed for each object: User.create([{ :first_name => 'Jamie' }, { :first_name => 'Jeremy' }]) do |u| u.is_admin = false end
update系メソッド
- update_attributeあんまつかわないので書き方忘れがち
- update_attribute!はないけどupdate_attributes!はある
@entry.update_attribute(:message, "new message")
update系メソッドその2
下記のようなメソッドがある。覚えておくと便利かも。
- increment(attribute, by = 1)
- increment!(attribute, by = 1)
- decrement(attribute, by = 1)
- decrement!(attribute, by = 1)
- toggle
- toggle!
update系メソッドその3
updateメソッドはクラスメソッド。使う機会はあんまなさげ
Entry.update(1, {:message => "new message"})
update_allはレコードをcronで一括変更するような時に使うと思う
Entry.update_all("update_at = '#{Time.now.to_s(:db)'}", ["updated_at < ?", 1.days.ago])
destroy系メソッド
- destroyメソッドはクラスメソッドとしてもインスタンスメソッドとしても使える
- クラスメソッドのdesroyはfindメソッドと同じように配列をとれる
- destroy_allメソッドはモデルオブジェクトのロード→コールバックとなるので遅い
- destroyをdeleteにするとコールバックが適用されなくなる。
entry.destroy Entry.destroy([1, 2]) Entry.destroy_all(["created_at < ?", 1.year.ago]) entry.delete Entry.delete([1, 2]) Entry.delete_all(["created_at < ?", 1.year.ago])
復習
ActiveRecord関連の情報は以前にブログにメモってた。結構忘れてる><定期的に見直すべき
ActiveRecord復習 - おもしろWEBサービス開発日記
忘れてたところの一部を再びメモ
- Person.columun_namesでカラムの名前を配列で取得できる。(クラスメソッド)
- Person.column_hash["name"]のようにすると、Personのname列の情報(デフォルト値とか)を取得できる。
- person.attribute_namesで属性の名前の配列が取得できる。(オブジェクトメソッド)
- person.age_before_type_castのように、属性名に_before_type_castをつけるとデータベースの値をそのまま取得する。(この場合は結果は特に変わらない)
reload
reloadメソッドでDBからモデルオブジェクトへ再ロードする。
- 属性の変更を取り消したいときに使う
- レコードを更新した場合や関連するオブジェクトを追加/削除した後に、DBの最新の状態を反映していることを明示するために使う
- 余計なクエリが発行されてしまったりしないのだろうか
- findと同じオプションが使える(たぶんlockオプションぐらいしか使うオプションはないだろうけど)