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
是此对象的实际来源。
我在 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
是此对象的实际来源。