2013-11-05 41 views
5

従来のRubyメソッドでは、以下の配列user_listからすべての重複オブジェクトを削除することができません。この問題を解決するスマートな方法はありますか?Rubyは配列から重複オブジェクトを削除します

users = [] 
user_list.each do |u| 
    user = User.find_by_id(u.user_id) 
    users << user 
    #users << user unless users.include?(user)  # does not work 
end 
#users = users.uniq  # does not work 
+2

などのオブジェクトnilを削除するためにコンパクトに使用することができます。あなたはそれをテストするために取ったステップとあなたの結果が何であるかを表示できますか?ユーザの配列内のオブジェクトのクラスは何ですか? '=='演算子はどのように定義されていますか?このRuby on Railsはありますか? –

+0

'Rails 4'または' Rails 3'を使用していますか?ああ、あなたはまったくレールを使っていますか?そうでなければ、 'User'クラスは何からですか? – nzifnab

+2

こんにちは、これは間違った警報でした!私は間違った形式のデータを持つメソッドを呼び出しました。 users.uniqは実際に動作しています!ご協力いただきありがとうございます。 – user2041343

答えて

9

これはいかがですか?

users = User.find(user_list.map(&:user_id).uniq) 

これは、1つのデータベース・コールの代わりに、user_list.sizeデータベース呼び出しであることの付加的な利点を持っています。

+0

これは彼が現在やっているよりはるかに効率的です。 'User.where(user_id:user_list.map(&:user_id))'を実行してデータベースクエリーを遅延実行し、uniqを自動的に処理することもできます。 – nzifnab

5
user_list.uniq! 

これにより、重複した値がすべて削除され、user_listに一意の値が保持されます。 これがあなたが探しているものであることを願っています。

0

またuniq`が実際に動作するはずです `

MainMenu.first.second_sale_elements.each.map(&:sale_structure).compact.uniq 
関連する問題