Rails上build和new有什么区别?

Sen*_*ran 27 ruby activerecord ruby-on-rails

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

klo*_*ner 58

new用于特定模型的新实例:

foo = Foo.new
Run Code Online (Sandbox Code Playgroud)

build用于在AR关联中创建新实例:

bar = foo.build_bar  # (has_one or belongs_to)
Run Code Online (Sandbox Code Playgroud)

要么

bar = foo.bars.build # (has\_many, habtm or has_many :through)
Run Code Online (Sandbox Code Playgroud)

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

  • 确实,但缺少一件事:foo.bars.build和foo.bars.new的差异(或等价). (11认同)
  • 你能分开你的旧答案和新的更新答案,并指出版本吗?目前,它读起来就像你说了一件事,然后在没有任何明确的压倒一切或过时的情况下自相矛盾. (3认同)