2013-08-16 84 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)