sort_by sort rails query left joins descending ruby-on-rails ruby sorting find

ruby-on-rails - rails - sort ruby



Ruby on Rails: encuentra registros sin ordenar (4)

Necesito encontrar los registros en el orden exacto, ya que se pasa como el parámetro de búsqueda.

Por ejemplo, tengo una cadena:

item_list = "23,12,54,45"

Con la siguiente consulta, obtengo registros en el orden asc de ''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.


Haz la ordenación del lado del cliente de esta manera:

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

Esto solo utiliza una consulta y sort_by solo calcula el bloque una vez para cada elemento, por lo que esa parte no debería ser tan cara. Si tiene que lidiar con muchos elementos, puede crear fácilmente un Hash que asocie el ID a su índice y lo use en el bloque sort_by .

La idea básica es ordenar una matriz usando la estructura de otra, por ejemplo:

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


Pruebe esto, aunque solo puede funcionar en MySQL:

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

Para conjuntos de datos más pequeños, podría dejar que Ruby clasifique los resultados, pero creo que dejar que la base de datos haga el trabajo por usted es mejor para conjuntos más grandes.


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


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