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