ruby-on-rails - query - rails where
¿Cómo hacer que Active Record se una para devolver objetos únicos? (3)
@dbjohn tiene la idea correcta, pero supongo que quieres evitar la creación de objetos adicionales. Aquí hay una pequeña variante de su solución, dejando que la base de datos le haga la integración:
date = "2013-01-01 00:00:00"
User.joins(:orders).where("orders.created_at >= ?", date).distinct
Tenga en cuenta que puede reorganizar el orden de los métodos para que se ajusten a lo que considere más semántico, y ActiveRecord escribirá el mismo SQL para usted.
Tengo una consulta simple: encuentre una lista de usuarios que hicieron un pedido desde el 1 de enero de 2013.
En SQL, es una consulta muy simple.
Pero estoy usando Rails y Active Record.
Así que escribí: User.joins(:orders).where("orders.created_at >= ''2013-01-01 00:00:00''")
En nuestra base de datos, tenemos 100 pedidos realizados desde 01/01/2013 por 75 usuarios. (Algunos usuarios hicieron aparentemente más de un pedido).
Sin embargo, la expresión anterior devuelve 100 usuarios. (Debe haber duplicados)
Intenté User.joins(:orders).where("orders.created_at >= ''2013-01-01 00:00:00''").uniq
Eso tampoco funciona.
¿Cómo puedo obtener los 75 usuarios que han realizado un pedido desde 01/01/2013?
Rails ha agregado uniq
desde la versión 3.2.1, así que ahora puedes usar uniq
User.joins(:orders).
where("orders.created_at >= ''2013-01-01 00:00:00''").
group(''users.id'')
group
método de group
se encadena a la consulta y le proporciona una lista de registros únicos.