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

Posted

技术标签:

【中文标题】Ruby on Rails。如何在 :belongs to 关系中使用 Active Record .build 方法?【英文标题】:Ruby on Rails. How do I use the Active Record .build method in a :belongs to relationship? 【发布时间】:2010-10-21 11:31:26 【问题描述】:

我在 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,因为它还没有保存。

我的问题是:

    如何构建才能让 Rails 足够聪明地找出如何以正确的顺序保存记录?

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

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

谢谢

【问题讨论】:

关于文档,请参阅 Rails 指南 "Methods added by belongs_to""Methods Added by has_one"。更多技术文档可以在 API 文档中找到:belongs_tohas_one 【参考方案1】:

记录在哪里:

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

collection.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”方法)

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

【讨论】:

@BushyMark:它使用 method_missing 或 metaporgramming 将这些方法添加到 define_method。 @Federico 缺少定义的方法在哪里? @alock27 与 ActiveRecord 对 find_by_emailfind_by_column_name 方法使用缺失方法的方式相同。它将您传递的方法转换为字符串并对其进行剖析并尝试将其与表的列名匹配。 @edmund 感谢您的评论。需要明确的是,我了解 method_missing 的工作原理。我试图找到定义此特定方法丢失的文件的实际位置。 @alock27 如果你问是因为你想了解它是如何定义的,你应该看看 Metaprogramming Ruby。但是,如果您真的在寻找实际位置,您可能可以谷歌搜索源代码。【参考方案2】:
@article = user.articles.build(:title => "MainTitle")
@article.save

【讨论】:

>> d.tags.build(:number => "123456") >> d.save # => true 不一样?

以上是关于Ruby on Rails。如何在 :belongs to 关系中使用 Active Record .build 方法?的主要内容,如果未能解决你的问题,请参考以下文章

ruby-on-rails - 嵌套资源问题

在Michael Hartl的Ruby on Rails教程中获取错误消息:MicropostsController中的NoMethodError #create,如何避免收到此消息?

ruby on rails 友谊以下节目总是我的名字

ruby on rails(model)

Ruby on Rails,一对多关联(One-to-Many)

ruby on rails如何安装