我正在编写一些Ruby-on-Rails代码,并且我对在Emirates_to / has_many关系中使用foreign_key
有疑问。
我有两个模型,一个是Slogan
,另一个是User
。两者之间的关系是一个标语仅对应一个用户(belongs_to),一个用户可以有多个标语记录(has_many)。下面列出了两种型号的代码
# slogan.rb
class Slogan < ApplicationRecord
belongs_to :author, class_name: :User, foreign_key: :author_id
end
# user.rb
class User < ApplicationRecord
has_many :slogans
end
为了维护和语义的方便,我将标语上的关联名称更改为author(最初应为用户),并将foreign_key更改为author_id
。
我的问题是,如果我还希望他/她从用户记录中获得的所有标语,是否还应该在用户模型中添加foreign_key
选项?
谢谢!
答案 0 :(得分:0)
我认为您不需要添加任何内容。但是您可以在Rails中使用双向关联。
Active Record提供了:inverse_of
选项,因此您可以显式声明双向关联:
class Author < ApplicationRecord
has_many :books, inverse_of: 'writer'
end
class Book < ApplicationRecord
belongs_to :writer, class_name: 'Author', foreign_key: 'author_id'
end
使用此功能,您可以按照以下方式使用:
a = Author.first
b = a.books.first
a.first_name == b.writer.first_name # => true
a.first_name = 'David'
a.first_name == b.writer.first_name # => true
有关更多信息,请参见:attributesOfItem(atPath:)
答案 1 :(得分:0)
在您的错误消息中,我看到ID是user_id
而不是author_id
。您可以将表中的ID更改为author_id
,也可以从标语模型中删除foreign_key
。 foreign_key约束告诉您的Slogan
模型应该在数据库中寻找author_id
列。它找不到列,因为它名为user_id
。
答案 2 :(得分:0)
您必须在您的foreign_key
模型中添加 User
选项。
从文档https://guides.rubyonrails.org/association_basics.html#has-many-association-reference:
按照惯例,Rails假定用于保存外部元素的列 另一个模型上的键是带有后缀_id的该模型的名称 添加。
因此,如果您不添加foreign_key
选项,Rails会假设您在user_id
表上有一个slogans
列,这就是您拥有this error的原因。