ste*_*ard 128 activerecord ruby-on-rails foreign-keys
我一直无法在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
Run Code Online (Sandbox Code Playgroud)
这将正确地保存带有外键的狗和标签.这似乎不适用于某种belongs_to关系.
d = Dog.new
d.person.build # => nil object on nil.build
Run Code Online (Sandbox Code Playgroud)
我也试过了
d = Dog.new
d.person = Person.new
d.save # => true
Run Code Online (Sandbox Code Playgroud)
Dog在这种情况下未设置外键,因为在保存时,新人没有id,因为它尚未保存.
我的问题是:
如何构建工作,以便Rails足够聪明,弄清楚如何以正确的顺序保存记录?
我怎样才能在belongs_to关系中做同样的事情?
我在哪里可以找到有关此方法的任何文档?
谢谢
Bus*_*ark 147
在哪里记录:
来自" 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")
Run Code Online (Sandbox Code Playgroud)
甚至
t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")
Run Code Online (Sandbox Code Playgroud)
您还可以使用create_dog立即保存它(就像您可以在集合上调用的相应"create"方法一样)
导轨如何足够智能?这是神奇的(或者更确切地说,我只是不知道,很想知道!)
小智 47
@article = user.articles.build(:title => "MainTitle")
@article.save
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
119397 次 |
| 最近记录: |