如何在rails上的ruby中显示除当前用户和current_user的朋友之外的所有用户

时间:2014-10-19 15:48:54

标签: ruby-on-rails ruby rails-activerecord

我正在添加好友功能,在添加好友页面中,我想播放除当前用户和用户的朋友之外的所有用户,然后是“添加”按钮。但我只能在没有当前用户或用户朋友的情况下显示所有用户。 这是我在用户模型中的代码:

scope :all_except, ->(user) { where.not(id: user) && where.not(id: user.friends)}

这是用户控制器:

@users = User.all_except(current_user)

以下是观点:

<% for user in @users %>
    <div class="user">
      <p>
        <strong><%=h user.name %></strong>
        <%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>
      <div class="clear"></div>
      </p>
    </div>
 <% end %>

通过这样做,用户的朋友不会显示在页面上,但当前用户的名字仍然存在.. 有人可以帮忙吗?谢谢!

如果我使用

,我尝试更改代码
scope :all_except, ->(user) { where.not(id: user) && where.not(id: user.friends)}

where.not(id:user)不起作用,如果我使用

scope :all_except, ->(user) {where.not(id: user.friends) && where.not(id: user)}

where.not(id:user.friends)不起作用

4 个答案:

答案 0 :(得分:3)

如果您希望范围包含多个条件,则无法使用&&链接它们。

这两个方法调用正好碰巧按顺序调用,如果第一个返回真值,但只有最后一个将决定范围的结果。

因此,在该范围内完全忽略了您的第一个where。尝试交换两个where,你会看到:当前用户被排除但不是她的朋友。

应该是:

scope :all_except, ->(user) { where.not(id: (user.friends + [user]).map(&:id))}

答案 1 :(得分:0)

尝试使用:

scope :all_except,
  ->(user) { where.not(id: user) && where.not(id: user.friends.map(&:id))}

scope :all_except,
  ->(user) { where.not(id: user) && where.not(id: user.friends.select(:id))}

答案 2 :(得分:0)

要显示所有非current_user或current_users_friends的用户,这应该适合您:

scope :all_except, ->(user) { where(["id NOT IN (?)", ([user.friends.map(&:id) << user.id]) ]) }

答案 3 :(得分:0)

试试这个:

scope :all_except,->(user) {where.not(id: (user.friends.map(&:id) + user.id)}