0

我有 3 个模型:用户、列表、关注

我正在尝试实现一个系统,其中

  • 用户可以创建许多列表(列表包含照片,但与此问题无关)
  • 用户可以关注其他用户创建的列表

以下是我尝试构建此系统的方式:

首先我们有一个列表的数据库表:

lists: id, user_id

并指定如下模型:

class User < ActiveRecord::Base
  has_many :lists
end
class List < ActiveRecord::Base
  belongs_to :user
end

我们可以User.first.lists毫无问题地做。

现在我的挑战来自于试图创造追随者。我希望用户能够找到

  1. 他关注的所有列表
  2. 他创建的所有列表
  3. 关注他的列表的所有用户(或等效地,所有“关注者”)

这是我试图用来实现上述功能的数据库表:

followings: user_id, list_id, list_user_id

在此表定义中,user_id指定谁在关注列表,list_id指定被关注的列表,并list_user_id指定被关注的列表的所有者。list_user_id此处用于加快数据库查找速度,这样我们就不必将lists表与users表连接起来。

现在我被困住了。我试图将用户模型更改为以下内容:

class User < ActiveRecord::Base
  has_many :lists
  has_many :followings

  # Works
  has_many :following_lists, :through => :followings, :class_name => "List", :source => :list

  # Doesn't work
  has_many :followed_lists, :through => :followings, :class_name => "List", :source => :list, :conditions => {:list_user_id => self.id}

  # Doesn't work
  has_many :followers, :through => :followings, :class_name => "User", :source => :user
end

第一个目标“找到他关注的所有列表”,通过 完成has_many :following_lists,没有问题。但是,似乎很难获得用户的“所有列表被关注”和“所有关注者”。

问题是似乎没有办法指定用于在followings表中查找的键。例如,在查找用户 A 的关注者时,我需要在followings表中找到list_user_idequals的所有行A.id,但是has_many方法没有提供执行此操作的选项,条件也:conditions => {:list_user_id => self.id}不起作用(它会抱怨undefined method 'id')。

那么..您将如何处理这种情况?有没有更好的方法来设计表格,或者我们可以根据当前的表格定义实际计算出一些东西?

顺便说一句,这是Following模型的定义方式:

class Following < ActiveRecord::Base
  attr_accessible :list_id, :list_user_id, :user_id
  belongs_to :user
  belongs_to :list
  belongs_to :list_user, :class_name => "User"
end
4

1 回答 1

0

您正在尝试获得以下两件事:

1.)他创建的所有列表

2.) 所有关注他列表的用户(或者,等效地,所有“关注者”)

这两者都在用户拥有的列表之上进行过滤。因此与 :through => 以下的关联是不正确的。由于这会将列表范围限定为您关注的列表,而不是您拥有的列表。

做你想要的一种方法是这样的:

def followed_lists
  # This essentially limits your owned lists to ones with an entry in the followings table
  lists.join(:followings).all
end

def users_following_owned_lists
  lists.followers.all
end

您需要将关注者关联添加到列表 AR。

class List < ActiveRecord::Base
  has_many :followings

  has_many :followers, :through => :followings, :class_name => "User", :source => :user
end

另请注意,下表中的 list_user_id 并不是真正需要的。

于 2013-04-05T22:06:02.443 回答