首页 文章

Ruby on Rails . 如何在a:属于关系中使用Active Record .build方法?

提问于
浏览
124

我一直无法在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,因为它尚未保存 .

我的问题是:

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

  • 如何在 belongs_to 关系中做同样的事情?

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

谢谢

2 回答

  • 143

    在哪里记录:

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

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

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

    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”方法一样)

    导轨如何足够智能?这是神奇的(或者更确切地说,我只是不知道,很想知道!)

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

相关问题