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_name
的 create_#{association_name}
形式的方法。如果您需要更多信息,有 docs 个。
因此,要为 book
创建一个 title
,您需要如下内容:
book.create_title
它会如你所愿
我有一个模型 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_name
的 create_#{association_name}
形式的方法。如果您需要更多信息,有 docs 个。
因此,要为 book
创建一个 title
,您需要如下内容:
book.create_title
它会如你所愿