2012-01-21 132 views
0

我的問題應該很簡單,但我沒有明白。從一組對象中移除對象

例如我已經從數據庫以下數據:

@user = User.all 

然後我具有用戶的其它陣列

other_user = getting_them_from_somewhere_else 

現在我遍歷這兩個陣列上,並檢查是否一些用戶仍然在數據庫中檢查電子郵件:

@other_user.each do |o| 
    @user.each do |u| 
     if o["email"] == u["user_mail"] 
      @user.delete(u) 
      break 
     end 
    end 

    ... do something with o ... 
end 

方法@ user.delete(u)刪除用戶從數據庫中,但我只想從陣列@user中刪除對象u。

+0

@user不是一個數組..這是可以肯定的集合,而是一個ActiveRecord集合。你可以遍歷它,並做一堆可能感覺像一個數組的東西。不要把它看作一個數組。它會打破你的心。 – baash05

回答

0

你可以做反之亦然

result_users = [] 
@other_user.each do |o| 
    @user.each do |u| 
     if o["email"] != u["user_mail"] 
      result_users << u 
     end 
    end 

    ... do something with o ... 
end 
here you should use result_users array which has the users you need 
0

您可以使用:

@other_user.each do |o| 
    @user.delete_if{|u| u["email"] == o["email"]} 
end 

它更簡單,並沒有刪除的數據庫,只有在數組中刪除。 =)

0

如何去便宜的方式...減少工作.. 創建一個你知道的,不想再想的電子郵件地址的數組。

other_emails = @other_user.map{|o| sanitize(o["email"]) } 
@users = User.where("email not in ( #{other_emails.join(',')} )") 

這種方法有很多優點。

  1. 只有一個循環(地圖),沒有嵌入任何東西。
  2. 只有一個數組調整大小(地圖)。我們不會調用delete,這對數組是一個沉重的操作。
  3. 我們只通過網絡獲得我們關心的記錄。當你只關心一小部分時,拉下100萬條記錄是愚蠢的。努力從數據庫中讀取你需要的東西。

有時讓數據庫做事情更聰明。

0

我覺得你並不需要使用@ user.email,只是:

@users.delete_if {|user| @other_user.include? user}