2011-09-22 14 views
28

Obtengo un conjunto de resultados de una consulta de búsqueda de Rails. Quiero iterar sobre ese conjunto de resultados y, dependiendo de ciertos criterios, soltar los registros de ese conjunto de resultados antes de pasarlo para su posterior procesamiento. Los criterios adicionales son externos a los datos almacenados en la base de datos y, por lo tanto, no puedo incluirlos en la consulta original 'buscar'.¿Cómo eliminar elementos del conjunto de resultados de consulta de Activerecord?

Nota: No quiero borrar ningún registro de la base de datos simplemente elimínalos del conjunto de resultados.

Por favor alguien me puede dar el código para hacer eso.

+0

¿Alguna vez encontró lo que estaba buscando? – Magnum

+0

Esto se puede cerrar como "demasiado amplio" o "recomendación para recurso fuera del sitio". – halfer

Respuesta

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

o

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

Cuando hago esto 'set' parece convertirse en una' matriz'? – Deekor

+0

'find' solo devuelve un objeto. Tal vez quieras 'MyObject.all' o' MyObject.where' –

+0

@DylanVanderBerg ¿te das cuenta de que esta pregunta es sobre RoR v1 o v2? :) – fl00r

30

Uso reject como en

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

Esto no funcionará, ya que 'find_by_xxx' devuelve un único registro. Quieres 'find_all_by_xxx'. –

+1

@RyanBigg oops, tienes razón. Cuando respondí, estaba trabajando en un proyecto de Doctrine, en el que 'find_by_xxx' devuelve una colección. Editado – Fabio

1

Puede utilizar delete_at también:

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

Este eliminará la entrada de la base de datos, ¿verdad? – JustBasti

0

Si algún procesamiento debe hacerse en el código de aplicación que SQL poder no hacer, y el resultado debe ser un objeto de consulta modificado, volver a consultar los objetos por id podría ser una opción (muy ineficiente en la memoria).

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