2つの列で並べ替えたい、1つはDateTime(updated_at
)、もう1つはDecimal(Price)
最初にupdated_atでソートできるようにしてから、同じ日に複数のアイテムが発生する場合は、Priceでソートします。
2つの列で並べ替えたい、1つはDateTime(updated_at
)、もう1つはDecimal(Price)
最初にupdated_atでソートできるようにしてから、同じ日に複数のアイテムが発生する場合は、Priceでソートします。
回答:
Rails 4では、次のようなことができます。
Model.order(foo: :asc, bar: :desc)
foo
とbar
dbの列です。
Thing.find(:all, :order => "updated_at desc, price asc")
トリックを行います。
Thing.all.order("updated_at DESC, price ASC")
Rails 3への道のりです。(ありがとう@cpursley)
Thing.all.order("updated_at DESC, price ASC")
Thing.order("LOWER(name), number")
。
Active Record Query Interfaceを使用すると、クエリを並べ替えるだけの属性を指定できます。
models = Model.order(:date, :hour, price: :desc)
または、より具体的にしたい場合(@ zw963に感謝):
models = Model.order(price: :desc, date: :desc, price: :asc)
おまけ:最初のクエリの後で、他のクエリを連鎖させることができます。
models = models.where('date >= :date', date: Time.current.to_date)
model
しmodels
ます。ただの提案です。
:asc
代わりにasc
:Model.order({price: :desc}, {date: :desc}, {price: :asc})
実際には、Active Recordを使用してそれを行う多くの方法があります。上記で言及されていないものは(さまざまな形式で、すべて有効です):
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
多分もっと冗長かもしれませんが、個人的には管理しやすいと思います。SQLは1つのステップでのみ生成されます。
SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
したがって、元の質問の場合:
Model.order(:updated_at).order(:price)
データ型を宣言する必要はありません。ActiveRecordはこれをスムーズに行い、DBエンジンもそうします
Model.order(foo: :asc).order(:bar => :desc).order(:etc)
ますか?SQLの順序句の順序は、SQLで実行.to_sql
したときに得られる順序とは逆です。
これらのどれも私にはうまくいきませんでした!ちょうど2日間、インターネットでトップとボトムを見て、解決策を見つけました!!
special_priceやmsrpなど、productsテーブルに多くの列があるとしましょう。これらは、ソートしようとしている2つの列です。
さて、まずモデルに次の行を追加します:
named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
次に、製品コントローラーで、検索を実行する必要がある場所を追加します。
@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
:order => ["DATE(#{table_name}.updated_at)", :price]
(これ:price
はシンボルです)