0

我有一个,当我登录时Users list,我需要为每个用户放置按钮。follow/unfollow

还有一些其他地方我想使用相同的方法来关注主题/组等。所以我认为最好写一个关联以避免每次我需要这些按钮时进行额外的查询。

我的user_followings表结构

| id | user_id | recipient_id | 
| 1  | 1       | 2            | 
| 2  | 3       | 2            | 
| 3  | 10      | 3            |

所以这里 id=1 的用户跟随用户 => 2 ...

所以基本上有has_many关联类型,因为用户正在关注许多其他用户。但是我想出了一个添加has_one关联类型的想法,我将在其中添加一个附加条件recipient_id=current_user.id,因此只剩下一条记录并显示以下状态。

如果我成功做到这一点association,将非常容易通过user.following.nil?查看查看以下状态,而无需额外的查询、缓存等。

我之前在我的 CakePHP 应用程序中做过一次,SQL 查询如下所示:

ON (`UserFollowing`.`recipient_id` = `User`.`id` AND `UserFollowing`.`user_id` = 1)

但是 CakePHP 允许动态绑定关系,所以我将 session 中的 current_user.id 直接添加到关联条件中。

我不能在 Rails 中这样做,因为我不能放入current_user.id模型来描述条件:

user.rb
has_one :following, :class_name => 'UserFollowing', :conditions => {:user_id => current_user.id}

方法 Nb。2

也许我可以使用 解决这个问题:through,但我找不到任何示例来users从我进行关联的同一张表中获取结果。

方法 Nb。3

是否使用范围Rails 3 设计, current_user 在模型中不可访问?

不确定,哪种方式最好...

4

3 回答 3

0

好吧,我找到了使用范围执行此操作的方法:

  # user.rb
  scope :with_relations, lambda { |current_user_id|
    has_one :user_following, :foreign_key => 'recipient_id', :conditions => {:user_id => current_user_id}
    where(:status => 1)
  }

  # users_controller.rb
  @users = User.with_relations(current_user.id).limit(30).order('last_action desc')
于 2013-03-26T18:59:55.407 回答
0

关于这个问题,请阅读第 11 章。为 AZ 阅读有关构建类似 twitter 的应用程序的整本书。

Ruby On Rails 教程

于 2013-03-26T16:35:08.900 回答
0

虽然这不是您问题的直接答案:考虑 gem: acts_as_follower。我将它用于类似的情况,它似乎符合您的需求。可以让任何东西跟随其他任何东西 - 看看......

于 2013-03-26T18:36:14.757 回答