2011-09-22 10 views
28

Railsの検索クエリから結果セットを取得します。私はその結果セットを反復処理し、特定の基準に応じて、その結果セットからレコードを削除してから、それをさらに処理するために渡します。追加基準はデータベースに保持されているデータの外部にあるため、元の 'find'クエリには追加できません。Activerecordクエリの結果セットから項目を削除するには?

注意データベースからレコードを削除する必要はなく、結果セットからレコードを削除するだけです。

誰かが私にそれを行うコードを教えてください。

+0

あなたが探していたものは見つかりましたか? – Magnum

+0

これは、「広すぎる」または「オフサイトリソースの推奨」として閉じることができます。 – halfer

答えて

6
set = MyObject.find(...) 
set = set.reject{|s| ... } 

または

set = set.select{|s| ... } 
+2

これを行うと、 'set'が' array'に変換されたようですか? – Deekor

+0

'find'は1つのオブジェクトだけを返します。多分あなたは 'MyObject.all'または' MyObject.where'を望んでいるでしょう –

+0

@DylanVanderBergあなたはこの質問がRoR v1またはv2に関することを認識していますか? :) – fl00r

30

使用rejectあなたもdelete_at使用することができます

Model.find_all_by_xxx().reject { |r| r.something? } 
+5

これは 'find_by_xxx'が単一のレコードを返すので動作しません。 'find_all_by_xxx'が必要です。 –

+1

@RyanBiggおっと、そうです。私はDoctrineプロジェクトに取り組んでいましたが、 'find_by_xxx'がコレクションを返しました。編集されました。 – Fabio

1

のように:いくつかの処理はアプリケーションコードでそのSQLを行わなければならない場合

irb(main):005:0> c = Category.all 
Category Load (0.3ms) SELECT "categories".* FROM "categories" 
=> [#<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53">] 
irb(main):006:0> c.delete_at(0) 
=> #<Category id: 1, name: "15 anos", description: nil, created_at: "2011-09-22 04:52:53", updated_at: "2011-09-22 04:52:53"> 
irb(main):007:0> c 
=> [] 
+4

これはデータベースからエントリを削除しますか? – JustBasti

0

をできる 結果は変更されたクエリオブジェクトでなければならず、オブジェクトをidで再度クエリすると(非常にメモリ非効率的な)オプションになる可能性があります。

needed_ids = Model.where(<some original query>).map{|r| r.something? ? r.id : nil }.compact 
new_collection = Model.where(id: needed_ids) 
関連する問題