2011-09-22 15 views
28

Ricevo un set di risultati da una query di ricerca di Rails. Voglio eseguire un'iterazione su quel set di risultati e, in base a determinati criteri, rilasciare i record da quel gruppo di risultati prima di inviarli per un'ulteriore elaborazione. I criteri aggiuntivi sono esterni ai dati conservati nel database e quindi non posso includerli nella query di ricerca originale.Come rimuovere elementi dal set di risultati della query Activerecord?

Nota Non desidero eliminare alcun record dal database rimuoverli dal set di risultati.

Per favore qualcuno può darmi il codice per farlo.

+0

Hai mai trovato quello che stavi cercando? – Magnum

+0

Questo può essere chiuso come "troppo ampio" o "raccomandazione per la risorsa fuori sito". – halfer

risposta

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

o

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

Quando faccio questo 'set' sembra essere convertito in un' array'? – Deekor

+0

'find' restituisce solo un oggetto. Forse vuoi 'MyObject.all' o' MyObject.where' –

+0

@DylanVanderBerg ti rendi conto che questa domanda riguarda RoR v1 o v2? :) – fl00r

30

Usa reject come in

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

Questo non funzionerà, come 'find_by_xxx' restituisce un singolo record. Vuoi 'find_all_by_xxx'. –

+1

@RyanBigg oops, hai ragione. Stavo lavorando su un progetto Doctrine alla risposta, in cui "find_by_xxx" restituisce una collezione. Modificato. – Fabio

1

È possibile utilizzare delete_at troppo:

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

Questo cancellerà la voce dal database, giusto? – JustBasti

0

Se qualche trasformazione deve essere fatto in codice dell'applicazione che SQL può non fare, e il risultato deve essere un oggetto di query modificato, ri-interrogare gli oggetti tramite id potrebbe essere un'opzione (molto inefficiente di memoria).

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