有人能告诉我Rails上的build和new命令有什么区别吗?
答案 0 :(得分:54)
new适用于特定模型的新实例:
foo = Foo.new
build用于在AR关联中创建新实例:
bar = foo.build_bar # (has_one or belongs_to)
或
bar = foo.bars.build # (has\_many, habtm or has_many :through)
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
<强>更新强>
Per @toklands的建议,build和new是ActiveRecord::Relation中定义的别名:
因此,如果类Foo has_many Bars,则以下具有相同的效果:
foo.bars.new
&lt; =&gt; foo.bars.build
Bar.where(:foo_id=>foo.id).new
&lt; =&gt; Bar.where(:foo_id=>foo.id).build
如果!foo.new_record?
foo.bars.new
&lt; =&gt; Bar.where(:foo_id=>foo.id).new
答案 1 :(得分:16)
答案 2 :(得分:1)
在rails 2.2之前,您需要为关系的has_many / has_and_belongs_to_many部分构建,以便新记录自动设置其外键。例如:
user.timesheets.build
会设置外键。我认为对于rails 2.2及以后版本,new和build对has_many和has_and_belongs_to_many关系做同样的事情。
答案 3 :(得分:1)
我发现.build和.new之间的区别在于使用它们来创建一个虚拟的&#39;视图表单的对象,使用使用嵌套资源。
.build创建一个parent_id .new不
嵌套资源示例: @ list.items(其中Item嵌套在List下)
@ list.items.build ...为list_id生成一个所有nil值除外的对象。
Item.new使用所有nil值创建一个新的项目对象。
它出现在我的节目中。迭代@ list.items时的页面 直到我需要@ list.items进一步向下&#39;显示&#39;另一种形式的页面,其中@ list.items上的迭代暴露了具有关联list_id的项目(由.build生成的项目),但没有其他任何内容。
@ list.items.build =&GT; #
2.2.3:002&gt; Item.all.build =&GT; #
2.2.3:003&gt; Item.new =&GT; # 2.2.3:004>
答案 4 :(得分:1)
有一段时间,build使用新实例填充了调用者,但是new没有。现在,从Rails 4开始,new和build都会使用新实例填充调用者。如果你想获得一个想法,只需在控制台中玩耍。