Estoy tratando de buscar una lista de tiendas usando .where pero también estoy tratando de mantenerlas ordenadas como la misma matriz de ID.
es decir
ids = ["4", "15", "10", "20", "1"] stores = Store.published.where(id: ids) Parece que las tiendas se devuelven en orden ascendente de la identificación, como [{id: 20}, {id: 15} {id: 10}, {id: 4}, {id: 1}] . Me gustaría mantener ordenadas las tiendas devueltas de la misma manera que se ordenan las ids . También tenga en cuenta que los identificadores en cada tienda son enteros, mientras que los identificadores en la matriz de ids son cadenas.
Debido a que los números son los ID de los registros, simplemente puede usar:
ids = ["4", "15", "10", "20", "1"] stores = Store.find(ids) Esto funciona porque find también acepta una lista de ID y, cuando se proporciona una lista, find devolverá los registros en el mismo orden que en la lista.
Y en Ruby on Rails 7.0 podrá usar where en combinación con in_order_of que tiene la ventaja de no generar un error si no se encuentra un registro y que también puede ordenar por otras columnas y sus valores:
ids = ["4", "15", "10", "20", "1"] stores = Store.where(id: ids).in_order_of(:id, ids)Al realizar una consulta where(id: ids) , la base de datos simplemente ejecuta una consulta que limita los resultados a esos ID. La base de datos no devolverá los resultados según el orden de los identificadores que le proporcione, pero puede ordenar explícitamente los resultados de la base de datos por id (o cualquier otro atributo) con where(id: ids).order('id desc') para volver en orden decreciente por id. Otra opción que puede usar ActiveRecord#find con múltiples identificaciones y devolverá los resultados en el orden en que los solicite:
Store.published.find(ids) Sin embargo, where ignorará silenciosamente cualquier identificación que no se encuentre, mientras que find fallará si falta alguna identificación pasada.
Lo averigué. Quería seguir usando .where() para que no arrojara un error si la identificación no existía. Esta solución funcionó para mí ...
sorted_stores = stores.sort_by { |store| ids.index(store[:id]) }