maeshimaの日記

メモ書きです

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オプションぐらいしか使うオプションはないだろうけど)

annotate model plugin

migrationファイルを読んで、modelファイルの先頭にカラム定義をコメントで追加してくれる。

gem install annotate-models

でインストール。RAILS_ROOTにて

annotate

で実行。Rails 3で使うにはGemfileに

gem "annotate-models", :require => "annotate_models"

と書いておく必要がある