是否必须将foreign_key选项与belongs_to和has_many选项同时放置?

时间:2019-01-12 14:12:13

标签: ruby-on-rails associations

我正在编写一些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选项?

谢谢!

3 个答案:

答案 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的原因。

相关问题