首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby on Rails。如何在:属于关系中使用Active Record .build方法?

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

Stack Overflow用户
提问于 2009-04-23 21:23:19
回答 2查看 132.3K关注 0票数 140

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

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

例如:

代码语言:javascript
复制
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关系中似乎行不通。

代码语言:javascript
复制
d = Dog.new
d.person.build # => nil object on nil.build

我也试过

代码语言:javascript
复制
d = Dog.new
d.person = Person.new
d.save # => true

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

我的问题是:

  1. 构建如何工作,以便Rails足够智能,以确定如何按正确的顺序保存记录?
  2. 如何在belongs_to relationship?
  3. Where中执行相同的操作能否找到有关此方法的任何文档?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-24 02:17:19

其中记录了以下内容:

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

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

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

代码语言:javascript
复制
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")

甚至是

代码语言:javascript
复制
t = Tag.new
t.build_dog(:name => "Rover", :breed => "Maltese")

您也可以使用create_dog立即保存它(非常类似于您可以在集合上调用的相应的"create“方法)

rails怎么足够聪明呢?这很神奇(或者更准确地说,我只是不知道,我很想知道!)

票数 155
EN

Stack Overflow用户

发布于 2010-12-16 00:01:26

代码语言:javascript
复制
@article = user.articles.build(:title => "MainTitle")
@article.save
票数 51
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/783584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档