2011-09-22 11 views
28

Otrzymuję zestaw wyników z zapytania wyszukiwania Rails. Chcę powtórzyć ten zestaw wyników iw zależności od pewnych kryteriów usunąć rekordy z tego zestawu wyników przed przekazaniem go do dalszego przetwarzania. Dodatkowe kryteria są zewnętrzne w stosunku do danych przechowywanych w bazie danych, a zatem nie mogę uwzględnić ich w oryginalnym zapytaniu "znajdź".Jak usunąć elementy z zestawu wyników kwerendy Activerecord?

Uwaga Nie chcę usuwać żadnych rekordów z bazy danych po prostu usunąć je z zestawu wyników.

Czy ktoś może mi podać kod, aby to zrobić.

+0

Czy kiedykolwiek znalazłeś to, czego szukałeś? – Magnum

+0

Można to zamknąć jako "zbyt szerokie" lub "zalecenie dla zasobów poza siedzibą". – halfer

Odpowiedz

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

lub

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

Kiedy to zrobię, 'set' wydaje się być konwertowany na' tablicę'? – Deekor

+0

'find' zwraca tylko jeden obiekt. Być może chcesz 'MyObject.all' lub' MyObject.where' –

+0

@DylanVanderBerg Czy zdajesz sobie sprawę, że to pytanie dotyczy RoR v1 lub v2? :) – fl00r

30

Zastosowanie reject jak w

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

To nie zadziała, ponieważ 'find_by_xxx' zwraca pojedynczy rekord. Chcesz 'find_all_by_xxx'. –

+1

@RyanBigg oops, masz rację. Pracowałem nad projektem Doctrine, gdy otrzymałem odpowiedź, w którym 'find_by_xxx' zwraca kolekcję. Edytowane. – Fabio

1

Można użyć delete_at też:

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

Ten usunie wpis z bazy danych, prawda? – JustBasti

0

Jeśli niektóre przetwarzanie musi odbywać się w kodzie aplikacji, że SQL mogą nie, a wynik musi być zmienionym obiektem zapytania, ponowne zapytanie do obiektów przez id może być opcją (bardzo mało wydajną pod względem pamięci).

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