WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

ActiveRecord の new と build の違い

      2015/05/31

ActiveRecord の 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
&#91;/ruby&#93;

(app/models/comment.rb)
&#91;ruby&#93;
class Comment < ActiveRecord::Base
  belongs_to :article
end
&#91;/ruby&#93;

<p>
newは対象のモデルのインスタンスを生成するおなじみのメソッドである。
</p>

[ruby]
@comment = Comment.new
 => #<Comment id: nil, name: nil, body: nil, article_id: nil, created_at: nil, updated_at: nil>

一方の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

参考
Rails new vs build | vinhboy.com

 - Ruby on Rails , , , ,