2013-08-16 47 views
1

我试图在我的应用中过滤用户搜索的结果,以仅显示不是朋友的用户。我的朋友表有3列; f1(发送请求者的用户ID),f2(接收请求的朋友的用户ID)以及确认(布尔值为true或false)。正如你所看到的,@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

而不是'删除'尝试使用'销毁' –

+0

不会破坏用户? – brad

+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集。

+0

这工作。谢谢! – brad

1

虽然我同意,有可能会实现你在做什么更好的办法,我认为你面临的具体问题是,在轨道4中,where方法返回一个ActiveRecord::Relation不是Array。虽然您可以在Relation上使用each,但通常无法执行阵列操作。

但是,您可以将Relation转换为Arrayto_a方法为:

@usersfiltered = User.where("first_name LIKE?", "%#{params[:first_name]}%").to_a 

这将然后让你做你的循环中执行以下操作:

usersfiltered.delete(fa)