Rails上build和new有什么区别?

任何人都可以告诉我在Rails上构建和新命令之间的区别是什么?

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的建议,构建和新的是ActiveRecord :: Relation中定义的别名:

因此,如果类Foo has_many Bars,以下具有相同的效果:

  • foo.bars.new <=> foo.bars.build
  • Bar.where(:foo_id=>foo.id).new <=> Bar.where(:foo_id=>foo.id).build

如果!foo.new_record?

  • foo.bars.new <=> Bar.where(:foo_id=>foo.id).new

新建和构建与文档https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation.rb相同

在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关系做同样的事情。

我在使用嵌套资源时使用它们为视图表单创建“虚拟”对象时,观察到了.build和.new之间的区别。

.build创建一个parent_id .new不会

嵌套资源示例:@ list.items(其中Item嵌套在List下)

@ list.items.build …为list_id生成一个所有nil值为EXCEPT的对象。

Item.new创建一个具有所有nil值的新项目对象。

迭代@ list.items后出现在我的’show’页面中直到我需要@ list.items进一步向下同一个’show’页面的另一种forms,其中@ list.items上的迭代暴露了该项目(一个由.build生成的,它有一个关联的list_id,但没有别的。

下面的一些示例输出……

@ list.items.build =>#


2.2.3:002> Item.all.build =>#


2.2.3:003> Item.new =>#2.2.3:004>

有一段时间,build使用新实例填充调用者,但是new没有。 现在,从Rails 4开始,new和build都会使用新实例填充调用者。 如果你想获得一个想法,只需在控制台中玩。