2011-09-22 23 views
28

Rails bulmak sorgudan bir sonuç alırım. Bu sonuç üzerinde yinelemek istiyorum ve belirli ölçütlere bağlı olarak, daha sonraki işlemler için kullanmadan önce bu sonuçlardan gelen kayıtların düşmesine bağlı olarak. Ek ölçütler, veri tabanında tutulan veriler için haricidır ve dolayısıyla bunları orijinal 'bulma' sorusuna dahil edemem.Activerecord sorgu resultset öğesinden nasıl kaldırılır?

Not Herhangi bir kaydı veritabanından silmek istemiyorum, bunları yalnızca sonuç kümesinden kaldırmak istiyorum.

Lütfen birisi bunu yapmak için bana kodu verebilir.

+0

Hiç aradığınızı buldunuz mu? – Magnum

+0

Bu "çok geniş" veya "site dışı kaynak için öneri" olarak kapatılabilir. – halfer

cevap

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

veya

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

Bunu yaptığımda "set" bir dizi haline dönüştürülmüş gibi görünüyor? – Deekor

+0

'find' yalnızca bir nesne döndürür. Belki de 'MyObject.all' veya 'MyObject.where' –

+0

@DylanVanderBerg'i istiyorsun, bu sorunun RoR v1 veya v2 ile ilgili olduğunu biliyor musunuz? :) – fl00r

30

kullanın Sen de delete_at kullanabilirsiniz reject

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

'find_by_xxx' tek bir kayıt döndürdüğü için bu çalışmaz. 'Find_all_by_xxx' istiyorsun. –

+1

@RyanBigg oops, haklısınız. "Find_by_xxx" ifadesinin bir koleksiyon döndürdüğü yanıtlandığında Doctrine projesi üzerinde çalışıyordum. Düzenlenen. – Fabio

1

olduğu gibi: Bazı işleme SQL uygulaması kodunda

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

Bu, girişi veritabanından siler, değil mi? – JustBasti

0

yapılması gerekiyorsa kutu yapmaz ve sonuç değişmiş bir sorgu nesnesi olmalı, nesneleri yeniden sorgulamak id (çok bellek verimsiz) seçeneği olabilir.

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