2011-08-23 32 views
5

Necesito encontrar los registros en el orden exacto ya que se pasan como el parámetro de búsqueda.Ruby on Rails: Buscar registros sin ordenar

Por ejemplo, tengo una cadena:

item_list = "23,12,54,45" 

con la siguiente consulta, consigo los registros en el orden de asc 'item_list' - "12,23,45,54".

Inventory.find(item_list.split(",")) 

¿Cómo modifico la consulta anterior para que devuelva los registros en el mismo orden de 'item_list'.

Gracias.

+0

Lo que haber devuelto el mayor conjunto de datos que planea? – Dex

Respuesta

4

probar esto, a pesar de que sólo se puede trabajar en MySQL:

Inventory.where("id IN (#{item_list})").order("find_in_set(id, '#{item_list}')") 

Para los conjuntos de datos más pequeños se podía permitir Rubí ordenar los resultados, pero creo que dejar que la base de datos hacer el trabajo para usted es mejor para conjuntos más grandes.

0
item_list.split(",").collect do |item| 
    Inventory.find(item) 
end 
+1

¿No debería ser recolectar en lugar de cada uno? –

+0

Esto disparará muchas consultas. –

+0

@Christopher: puede ser; depende de lo que estás tratando de hacer. En un caso general, probablemente tengas razón. Lo cambiaré ahora. – jnevelson

0
unordered_records = Inventory.where(:id => item_list) 
item_list.collect { |id| unordered_records.detect { |x| x.id == id } } 
1

realizar la ordenación en el lado del cliente como esto:

ids = item_list.split(',') 
items = Inventory.find(ids).sort_by { |i| ids.index(i.id) } 

Esto sólo se utiliza una consulta y sort_by sólo se computa el bloque una vez para cada elemento para que una parte no debería ser tan costoso. Si tiene muchos elementos que tratar, puede crear fácilmente un Hash que asigne el ID a su índice y usarlo en el bloque sort_by.

La idea básica es ordenar una matriz que utiliza la estructura de otro, por ejemplo:

>> a = [ 23, 11, 42, 5 ] 
>> b = [5, 23, 11, 42] 
>> b.sort_by { |i| a.index(i) } 
=> [23, 11, 42, 5]