根据传递给IN的IDS的顺序排序结果

时间:2013-05-29 15:15:28

标签: sql ruby-on-rails postgresql

鉴于

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然后只是select匹配给定id的菜肴然后重建数组但我不能这样做,因为我仍然想使用{{1}关于协会。

任何帮助或提示都将不胜感激,谢谢!

1 个答案:

答案 0 :(得分: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")