Quero classificar por duas colunas, uma é DateTime ( updated_at
) e a outra é decimal (preço)
Gostaria de poder classificar primeiro por updated_at e, em seguida, se vários itens ocorrerem no mesmo dia, classificar por Preço.
Quero classificar por duas colunas, uma é DateTime ( updated_at
) e a outra é decimal (preço)
Gostaria de poder classificar primeiro por updated_at e, em seguida, se vários itens ocorrerem no mesmo dia, classificar por Preço.
Respostas:
Supondo que você esteja usando MySQL,
Model.all(:order => 'DATE(updated_at), price')
Observe a distinção entre as outras respostas. A updated_at
coluna será um carimbo de data / hora completo, portanto, se você deseja classificar com base no dia em que foi atualizado, você precisa usar uma função para obter apenas a parte da data do carimbo de data / hora. Em MySQL, é isso DATE()
.
order
assim:Model.all(:order => "day asc, `order` asc")
No Rails 4, você pode fazer algo semelhante a:
Model.order(foo: :asc, bar: :desc)
foo
e bar
são colunas no banco de dados.
Thing.find(:all, :order => "updated_at desc, price asc")
vai fazer o truque.
Thing.all.order("updated_at DESC, price ASC")
é o caminho a seguir do Rails 3. (Obrigado @cpursley )
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
.
A interface de consulta do Active Record permite que você especifique quantos atributos desejar para ordenar sua consulta:
models = Model.order(:date, :hour, price: :desc)
ou se você quiser ser mais específico (obrigado @ zw963 ):
models = Model.order(price: :desc, date: :desc, price: :asc)
Bônus: após a primeira consulta, você pode encadear outras consultas:
models = models.where('date >= :date', date: Time.current.to_date)
model
para models
para que uma pessoa soubesse que está plural. Apenas uma sugestão.
:asc
vez de asc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
Na verdade, existem muitas maneiras de fazer isso usando o Active Record. Um que não foi mencionado acima seria (em vários formatos, todos válidos):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
Talvez seja mais prolixo, mas pessoalmente acho mais fácil de gerenciar. O SQL é produzido em apenas uma etapa:
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
Assim, para a pergunta original:
Model.order(:updated_at).order(:price)
Você não precisa declarar o tipo de dados, ActiveRecord faz isso sem problemas, e o mesmo acontece com o seu DB Engine
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
? A ordem das cláusulas de ordem no SQL é o oposto do que obtenho quando executo .to_sql
isso.
Nada disso funcionou para mim! Depois de exatamente 2 dias procurando em cima e embaixo na internet, encontrei uma solução !!
digamos que você tenha muitas colunas na tabela de produtos, incluindo: special_price e msrp. Estas são as duas colunas com as quais estamos tentando classificar.
Ok, primeiro em seu modelo, adicione esta linha:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
Em segundo lugar, no Controlador de Produto, adicione onde você precisa realizar a pesquisa:
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(Observe que:price
é um símbolo.)