我有Users list
,我需要在登录时为每个用户添加follow/unfollow
按钮。
还有其他一些地方,我想使用相同的方法来关注主题/组等。所以我认为最好写一个关联,以避免每次我需要这些按钮时的其他查询。
我的user_followings
表格结构
| id | user_id | recipient_id |
| 1 | 1 | 2 |
| 2 | 3 | 2 |
| 3 | 10 | 3 |
所以这里id = 1的用户跟随user => 2 ...
因此,bassicaly存在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允许动态绑定关系,因此我将会话中的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 devise, current_user is not accessible in a Model ?
执行此操作不确定,哪种方式最好......
答案 0 :(得分:0)
请具体阅读第11章。阅读A-Z的全书,了解如何构建推特应用程序。
答案 1 :(得分:0)
虽然这不是你问题的直接答案:考虑一下宝石:acts_as_follower。我用它来处理类似情况,似乎符合你的需求。可以让任何事情跟随其他任何事情 - 检查出来......
答案 2 :(得分: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')