140

我一直无法在 Rails 中找到任何关于 .build 方法的文档(我目前使用的是 2.0.2)。

通过实验,您似乎可以使用 build 方法has_many在保存任一记录之前将记录添加到关系中。

例如:

class Dog < ActiveRecord::Base
  has_many :tags
  belongs_to :person
end

class Person < ActiveRecord::Base
  has_many :dogs
end

# rails c
d = Dog.new
d.tags.build(:number => "123456")
d.save # => true

这将使用外键正确保存狗和标签。这似乎在一段belongs_to关系中不起作用。

d = Dog.new
d.person.build # => nil object on nil.build

我也试过

d = Dog.new
d.person = Person.new
d.save # => true

在这种情况下没有设置外键,Dog因为在保存时,新人没有id,因为它还没有保存。

我的问题是:

  1. 构建是如何工作的,以便 Rails 足够聪明地弄清楚如何以正确的顺序保存记录?

  2. 我怎样才能在一段belongs_to关系中做同样的事情?

  3. 我在哪里可以找到有关此方法的任何文档?

谢谢

4

2 回答 2

155

记录在哪里:

来自“ Module ActiveRecord::Associations::ClassMethods ”中 has_many 关联下的 API 文档

collection.build(attributes = {}, ...) 返回一个或多个集合类型的新对象,这些对象已经用属性实例化并通过外键链接到该对象,但尚未保存。注意:这仅在关联对象已经存在时才有效,如果它是 nil 则无效!

在相反方向构建的答案是稍微改变语法。在你与狗的例子中,

Class Dog
   has_many :tags
   belongs_to :person
end

Class Person
  has_many :dogs
end

d = Dog.new
d.build_person(:attributes => "go", :here => "like normal")

甚至

t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")

您还可以使用 create_dog 立即保存它(很像您可以在集合上调用的相应“创建”方法)

Rails 有多聪明?这很神奇(或者更准确地说,我只是不知道,很想知道!)

于 2009-04-24T02:17:19.233 回答
52
@article = user.articles.build(:title => "MainTitle")
@article.save
于 2010-12-15T16:01:25.663 回答