2013年2月14日木曜日

Railsでの似たような言葉での違いメモ

いくつか似たような言葉でしばしば混乱してきた自分のための丸パクリメモ。

findとfind_by

検索で複数件がヒットする場合、find では複数結果を配列で返すが、find_by_ は1件のみ返す
検索で1件もヒットしなかった場合、find は RecordNotFound となるが、find_by_ は nil を返す
参考 find と find_by_ の使い分け

newとbuildの違い

例えば、以下のようなアソシエーションが定義された2つのモデルがあったとする。
rails generate model article title:string body:text
rails generate model comment name:string body:text article:references

(app/models/article.rb)
class Article < ActiveRecord::Base
  has_many :comments
end

(app/models/comment.rb)
class Comment < ActiveRecord::Base
  belongs_to :article
end
newは対象のモデルのインスタンスを生成するおなじみのメソッドである。
@comment = Comment.new
 => #<comment 1="" article_id:="" body:="" created_at:="" id:="" name:="" nil="" updated_at:="">
一方のbuildはActiveRecordアソシエーションを扱う類のメソッドである。 newメソッドのようにインスタンスの生成を行えるが、親モデルに対する外部参照キーを自動でセットしてくれるところがnewメソッドと異なる。
Article.create(:title => 'テスト記事タイトル', :body => 'テスト記事本文')
@article = Article.find(1)
@comment = @article.comments.build
 => #<Comment id: nil, name: nil, body: nil, article_id: 1, created_at: nil, updated_at: nil>
has_manyではなくhas_oneでアソシエーションが定義されている場合は、以下のような構文で"build"できる。
@comment = @article.build_comment
参考 ActiveRecord の new と build の違い

newとcreateの違い

newはオブジェクトを生成する飲み。DBには変化がない。
createはオブジェクトを生成して、保存。INSERTまで行う。


create!とcreate、save!とsaveの違い

基本的には、それぞれ動作は一緒だが、失敗したときの動作が異なる。

  • create!・・・例外が発生する
  • create・・・生成されたオブジェクトが返る
  • save!・・・例外が発生する
  • save・・・falseが返る
メモ・・ビックリマークがあるときは、必ず成功すると思っているため、できなかったときは例外処理。
逆にビックリマークがないときは、失敗するかもしれない。だからその場合は別途対応しようという使い分けをする

参考 「!」の有無による違い

updateとupdate_attributesの違い

  • update_attribute、update_attributesやsave・・・1つのレコードを更新する際に使う
  • update、update_all ・・・複数のレコードを更新する際に使う


saveとupdateの違い

  • save・・・変更を加えたものを最後にsave(save!)を使い、DBに保存する
  • update_attribute(s)・・・いちいちsaveする必要はなく、Hoge.update_attributes(hoge: hoge, foo: foo)とまとめてupdateできる