用户列表中有follow / unfollow按钮

时间:2013-03-26 10:06:48

标签: ruby-on-rails-3

我有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 ?

执行此操作

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

3 个答案:

答案 0 :(得分:0)

请具体阅读第11章。阅读A-Z的全书,了解如何构建推特应用程序。

Ruby On Rails Tutorial

答案 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')