Techioz Blog

文字列で並べ替える方法、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)