has_many :通过 Rails 教程中的关联

has_many :through association in the Rails tutorial

我在 Rails 教程的最后一章中没有得到任何东西。

所以本章的目的是与其他用户建立友谊,这使它成为一个自我参照的协会。 (用户与其他用户有关系)

所以有了用户模型,就有了友谊模型,它充当了通过 table。

并且在代码中,class用户

class User < ActiveRecord::Base
  has_many :microposts, dependent: :destroy
  has_many :active_relationships,  class_name:  "Relationship",
                                   foreign_key: "follower_id",
                                   dependent:   :destroy
  has_many :passive_relationships, class_name:  "Relationship",
                                   foreign_key: "followed_id",
                                   dependent:   :destroy
  has_many :following, through: :active_relationships,  source: :followed
  has_many :followers, through: :passive_relationships, source: :follower
  .
  .
  .
end

但我不明白这部分:

  has_many :following, through: :active_relationships,  source: :followed
  has_many :followers, through: :passive_relationships, source: :follower

我们必须在 has_many :through 关联中指定我们正在经历的 table(关系 table)。但是在上面的代码中没有 :active_relationships 或 :passive_relationships table ,只有 Relationship class.

关系table:

class Relationship < ActiveRecord::Base
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
  validates :follower_id, presence: true
  validates :followed_id, presence: true
end

所以,我的问题是,它是如何工作的?

Tnx 汤姆

你是对的,你只有 关系 class.

在rails中默认会有has_namy :relationships那么你不必指定class name.

如果您不遵循rails默认规则,那么当您尝试使用不同的关联名称时, 您必须指定 class 名称.

在你的例子中

has_many :active_relationships,  class_name:  "Relationship",
                               foreign_key: "follower_id",
                               dependent:   :destroy

您在此处指定从 Relationship class.

中查找活动关系

has_many :through 指的是关联。

has_many :following, through: :active_relationships,  source: :followed

has_many :through 指的是关联,而不是 table。 :source 是该关联引用的 class 中的关系。

在这种情况下

has_many :followers, through: :passive_relationships, source: :follower

指的是这种关系

has_many :passive_relationships, class_name:  "Relationship",
                               foreign_key: "followed_id",
                               dependent:   :destroy

并且在关系 class 中,有一个 :follower 是此对象的实际来源。