0

与えられた

ids = [4, 2, 1, 3]
dishes = Dish.where("restaurant_id in (?)", ids)

ID のシーケンスに基づいて料理を並べ替えることができますか?

=> # I'd like to see something like this
=> dishes.map(&:restaurant_id)
=> [4, 4, 4, 4, 4, 2, 2, 2, 1, 1, 1, 1, 3, 3, 3, 3] etc.

I'm currently getting something like this
=> [1, 4, 3, 4, 4, 3, 3, 2, 3, 2, 4, 4, 4, 3, 4, 2, 2, 2, 2, 4, 3, 1, 1, 1, 3, 2, 2, 1, 4]

ID をループしてから、指定された ID に一致する料理だけをループしselectて配列を再構築できることはわかっていますが、関連付けで使用したいので、それはできませんwill_paginate

ヘルプやヒントをいただければ幸いです。

4

1 に答える 1

3

ここで考えられる唯一の効率的な (つまり「データベースにプッシュする」) 方法は、レストラン ID の配列を反復処理して次のようなテキストを生成することにより、データベースのカスタム order by 句を作成することです。

order by
  case restaurant_id
    when 4 then 1
    when 2 then 2
    when 1 then 3
    when 3 then 4
  end

そのような文字列を構築するためのロジックを推測するには、そのパターンで十分であることを願っています。

activerecord 呼び出しは次のようになります。

dishes = Dish.where("restaurant_id in (?)", ids).
              order("case restaurant_id when 4 then 1 when 2 then 2 when 1 then 3 when 3 then 4 end")
于 2013-05-29T15:28:03.470 に答える