我正在添加好友功能,在添加好友页面中,我想播放除当前用户和用户的朋友之外的所有用户,然后是“添加”按钮。但我只能在没有当前用户或用户朋友的情况下显示所有用户。 这是我在用户模型中的代码:
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)不起作用
答案 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)}