Rails上build和new有什么区别?

时间:2009-08-10 06:44:33

标签: ruby-on-rails ruby activerecord

有人能告诉我Rails上的build和new命令有什么区别吗?

5 个答案:

答案 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都会使用新实例填充调用者。如果你想获得一个想法,只需在控制台中玩耍。