Quiero ordenar por dos columnas, una es DateTime ( updated_at
) y la otra es Decimal (Price)
Me gustaría poder ordenar primero por updated_at, luego, si ocurren varios elementos el mismo día, ordenar por Precio.
Quiero ordenar por dos columnas, una es DateTime ( updated_at
) y la otra es Decimal (Price)
Me gustaría poder ordenar primero por updated_at, luego, si ocurren varios elementos el mismo día, ordenar por Precio.
Respuestas:
Suponiendo que está usando MySQL,
Model.all(:order => 'DATE(updated_at), price')
Tenga en cuenta la distinción de las otras respuestas. La updated_at
columna será una marca de tiempo completa, por lo que si desea ordenar en función del día en que se actualizó, debe usar una función para obtener solo la parte de la fecha de la marca de tiempo. En MySQL, eso es DATE()
.
order
así:Model.all(:order => "day asc, `order` asc")
En Rails 4 puedes hacer algo similar a:
Model.order(foo: :asc, bar: :desc)
foo
y bar
son columnas en el archivo db.
Thing.find(:all, :order => "updated_at desc, price asc")
hará el truco.
Thing.all.order("updated_at DESC, price ASC")
es el camino a seguir de Rails 3. (Gracias @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.
Active Record Query Interface le permite especificar tantos atributos como desee para ordenar su consulta:
models = Model.order(:date, :hour, price: :desc)
o si quieres ser más específico (gracias @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Bonificación: después de la primera consulta, puede encadenar otras consultas:
models = models.where('date >= :date', date: Time.current.to_date)
model
a models
para que una persona sepa que está pluralizada. Sólo una sugerencia.
:asc
lugar de asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
En realidad, hay muchas formas de hacerlo utilizando Active Record. Uno que no se ha mencionado anteriormente sería (en varios formatos, todos válidos):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Tal vez sea más detallado, pero personalmente me resulta más fácil de manejar. SQL se produce en un solo paso:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Por lo tanto, para la pregunta original:
Model.order(:updated_at).order(:price)
No necesita declarar el tipo de datos, ActiveRecord lo hace sin problemas, y también lo hace su motor de base de datos
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
? El orden de las cláusulas de orden en SQL es el opuesto al que obtengo cuando ejecuto .to_sql
eso.
¡Ninguno de estos funcionó para mí! ¡Después de exactamente 2 días de buscar arriba y abajo en Internet, encontré una solución!
digamos que tiene muchas columnas en la tabla de productos, incluyendo: special_price y msrp. Estas son las dos columnas con las que estamos tratando de ordenar.
Bien, primero en su modelo agregue esta línea:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
En segundo lugar, en el Controlador de producto, agregue dónde necesita realizar la búsqueda:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(Tenga en cuenta que:price
es un símbolo).