在rails关联中使用foreign_key has_many

时间:2016-12-16 11:15:17

标签: ruby-on-rails ruby rails-activerecord

有人可以解释一下我的代码是否正确。

我试图在rails association中获取foreign_key选项。

我有 2 型号: 预订作者

预订数据库架构:

  • 名称
  • USER_ID

作者db schema:

  • 名称

我的模特:

class Author < ApplicationRecord
  has_many :books, foreign_key: :user_id
end

class Book < ApplicationRecord
  belongs_to :author, foreign_key: :user_id
end

在这里,我不明白为什么我们应该在两个模型中定义 foreign_key 。这是必然的吗?

1 个答案:

答案 0 :(得分:6)

如果您已经使用了Rails期望的表名和列名,那么您不需要显式定义foreign_key。在您的情况下,如果外键列名为author_id,那么您可以非常简单地使用:

class Author < ApplicationRecord
  has_many :books
end

class Book < ApplicationRecord
  belongs_to :author
end

但是,在您的情况下,外键列不是根据Rails期望的名称命名的,因此您需要显式定义外键列名。这很好,但它确实为你做了一些工作。

如果您已明确定义外键,则应为两个关联定义外键。如果没有它,您的has_many关联将无效。

此外,您应该定义反向关联:

class Author < ApplicationRecord
  has_many :books, foreign_key: :user_id, inverse_of: :author
end

class Book < ApplicationRecord
  belongs_to :author, foreign_key: :user_id, inverse_of: :books
end

定义inverse_of可以使ActiveRecord减少查询次数,并消除一些意外行为。有关inverse_of的说明,请参阅Ryan Stenberg的Exploring the :inverse_of Option on Rails Model Associations