Rails has_one vs has_many 协会

Rails has_one vs has_many association

我有一个模型 say Book 和另一个模型 say Title。协会的简单定义如下。

class Book < ApplicationRecord
    has_one :title
end

class Title < ApplicationRecord
    belongs_to :book
end

现在,如果我在 Title 中生成外键为 book_id 的架构并为 Book 创建新记录,我将无法创建新的 Title 通过 book.title.create! 记录为 book.title returns nil.

但是,如果我将关联更改为

 class Book < ApplicationRecord
    has_many :titles
 end

然后我显然可以使用 book.title.create! 创建一个新的 Title 记录。因此,要使其与 has_one 关联一起工作,我必须做的事情是 book.title = Title.create!(foo: "bar", book_id: book.id).

当我在后一种情况下检查 book.title 的值时,控制台 returns <ActiveRecord::Associations::CollectionProxy []> 但对于前者,book.title returns nil 因此 NoMethod Error for nil class.

我尝试关注官方文档和堆栈中的其他一些帖子。但不知何故,我还是不清楚。

此行为的原因是 Rails 创建 每个 has_one association_namecreate_#{association_name} 形式的方法。如果您需要更多信息,有 docs 个。

因此,要为 book 创建一个 title,您需要如下内容:

book.create_title

它会如你所愿