文字列で並べ替える方法、Ruby
概要
文字列で並べ替える方法、Ruby
ケーキのリストをこの順序で整理したいと思います。したがって、すべての「Primo」ケーキが一番上にあり、その次にすべての「Multilayered」ケーキが続きます。各タイプのケーキはさらに「created_at」(作成された最も古いケーキが最初) によってリストされる必要があります。
@cakes = []
@cakes << @store.cakes.where(type: "Primo").order(created_at: :desc)
@cakes << @store.cakes.where(type: "Multilayered").order(created_at: :desc)
@cakes << @store.cakes.where(type: "Decorative").order(created_at: :desc)
@cakes << @store.cakes.where(type: "On Sale").order(created_at: :desc)
@cakes << @store.cakes.where(type: "Basic", "Basic").order(created_at: :desc)
1 つのクエリでそれを行う方法はありますか?
… 多分:
cake_eater_nom = []
c = @store.cakes
primo_cakes = c.where(type: "Primo").order(created_at: :desc)
cake_eater_nom << primo_cakes
multilayered_cakes = c.where(type: "Multilayered").order(created_at: :desc)
cake_eater_nom << multilayered_cakes
decorative_cakes = c.where(type: "Decorative").order(created_at: :desc)
cake_eater_nom << decorative_cakes
on_sale_cakes = c.where(type: "On Sale").order(created_at: :desc)
cake_eater_nom << on_sale_cakes
basic_cakes = c.where(type: "Basic").order(created_at: :desc)
cake_eater_nom << basic_cakes
解決策
すでに Ruby on Rails 7.0 を使用している場合は、次のように in_order_of を使用できます。
types = ['Primo', 'Multilayered', 'Decorative', 'On Sale', 'Basic']
@cakes = @store.cakes
.where(type: types)
.in_order_of(:type, types) # sort by type (from list) frist
.order(:created_at) # then by created_at (oldest first)