0

我是 Rails 新手,完成了 Michael Hartl 的“Ruby on Rails 3 教程”。虽然这本书教会了我很多,但我发现这个谜题我不明白。

预览一下谜题,也就是看不懂,在User模型里面,

has_many :following, :through=>:relationship, :source=>:followed

这段代码如何将“user.following”链接到用户实例数组。

下面是整个谜题。

首先,我有Relationship模型,它记录followed_idfollower_id信息。在关系模型中,关联很简单

class Relationship < ActiveRecord::Base
  attr_accessible :followed_id

  belongs_to :follower, :class_name => "User"
  belongs_to :followed, :class_name => "User"
end

然后,在 User 模型内部,一个用户将扮演追随者的角色,并通过关系关联将其所有后续行收集到关系表中。

class User < ActiveRecord::Base
  .
  .
  .
  has_many :relationships, :foreign_key => "follower_id", :dependent => :destroy
  .

直到现在,我明白了。

但是下一行出现了混乱,通过user.following它可以组装所有用户的关注(用户实例)。像这样,

has_many :following, :through=>:relationships, :source=>:followed

我知道:source=>:followed将覆盖默认值,并让查找与该用户关联的所有follow_ids

但是,Rails 如何识别follow_id以链接到User对象?标签名称与users不匹配,也没有:class_name指定。我只是不明白 Rails 是如何完成这项基础工作的,或者我错过了一些提示。

谢谢!:)

4

2 回答 2

1

但是,Rails 如何识别 follow_id 以链接到 User 对象?标签名称与用户不匹配,也没有指定 :class_name。我只是不明白 Rails 是如何完成这项基础工作的,或者我错过了一些提示。

Rails 识别这是一个用户对象,因为它是在关系的 belongs_to 中设置的。Rails 在这里所做的是通过外键“follower_id”跟踪关系类,并返回与当前用户有关系的每个用户,如下所示。当然,Rails 在一条 SQL 语句中做到这一点,如下所示:

SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `relationships`.followed_id = `users`.id WHERE ((`relationships`.follower_id = <the current user id>  ))
于 2011-08-30T08:58:53.990 回答
0
has_many :following, :through=>:relationships, :source=>:followed

这向 Rails 解释了这following是反向关系,following并且用户有很多追随者并通过他的关系追随。

Rails 知道followed_id与 User 相关联的方式是它是在您的Relationship模型中定义的。

希望你已经明白了!祝你好运 :)

于 2011-08-30T08:40:13.180 回答