我正在尝试在我的应用中过滤用户搜索的结果,仅显示非朋友的用户。我的朋友表有3列; f1(发送请求的人的用户ID),f2(收到请求的朋友的用户ID),确认(真或假的布尔值)。如您所见,@ usersfiltered是搜索的结果。然后建立当前用户的朋友的定义。然后我试图从搜索结果中删除朋友。这似乎不起作用,但应该非常直接。我试过删除(不好)并销毁。
def index
#THIS IS THE SEARCH RESULT
@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" )
#THIS IS DEFINING ROWS ON THE FRIEND TABLE THAT BELONG TO CURRENT USER
@confirmedfriends = Friend.where(:confirmed => true)
friendsapproved = @confirmedfriends.where(:f2 => current_user.id)
friendsrequestedapproved = @confirmedfriends.where(:f1 => current_user.id)
#GOING THROUGH SEARCH RESULTS
@usersfiltered.each do |usersfiltered|
if friendsapproved.present?
friendsapproved.each do |fa|
if usersfiltered.id == fa.f1
#NEED TO REMOVE THIS FROM RESULTS HERE SOMEHOW
usersfiltered.remove
end
end
end
#SAME LOGIC
if friendsrequestedapproved.present?
friendsrequestedapproved.each do |fra|
if usersfiltered.id == fra.f2
usersfiltered.remove
end
end
end
end
端
答案 0 :(得分:1)
我会用另一种方式翻转它。从循环中获取循环不变的逻辑,这提供了良好的一阶简化:
approved_ids = []
approved_ids = friendsapproved.map { |fa| fa.f1 } if friendsapproved.present?
approved_ids += friendsrequestedapproved.map { |fra| fra.f2 } if friendsrequestedapproved.present?
approved_ids.uniq! # (May not be needed)
@usersfiltered.delete_if { |user| approved_ids.include? user.id }
如果为了删除目的而单独创建friendsapproved
和friendsrequestedapproved
,则可能会进一步简化此操作。您可以生成一个由两者组成的friendsapproval
列表,并避免联合上面的ID集。
答案 1 :(得分:1)
虽然我同意可能有更好的方法来实现您正在做的事情,但我认为您遇到的具体问题是在Rails 4中,where
方法返回ActiveRecord::Relation
而不是Array
。虽然您可以在each
上使用Relation
,但通常无法执行数组操作。
但是,您可以使用Relation
方法将Array
转换为to_a
,如下所示:
@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%" ).to_a
这将允许您在循环中执行以下操作:
usersfiltered.delete(fa)