如何使用属于关系中的 ActiveRecord.build 方法?

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

通过实验,似乎可以使用构建方法在保存记录之前将记录添加到 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. 我在哪里可以找到有关此方法的任何文档?

谢谢你

137115 次浏览

记录在案的:

来自“ 模块 ActiveRecord: : Associations: : ClassMethod”中 has _ many 关联下的 API 文档

Build (属性 = {} ,...) 类的一个或多个新对象 集合类型 用属性和 通过一个 外键,但还没有被 注意: 只有在 关联对象已经存在,而不是 如果没有的话!

反方向构建的答案是稍微改变一下语法,

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 将其立即保存(非常类似于您可以对集合调用的相应“ create”方法)

轨道怎么会足够聪明? 它是魔术(或者更准确地说,我只是不知道,想要找出来!)

@article = user.articles.build(:title => "MainTitle")
@article.save