2013-05-29 45 views
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] 

我知道我可以要么通过IDS循环,然后只是select菜匹配,则给定id重建的磁盘阵列,但我不能这样做,因为我还是想在关联使用will_paginate

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

+0

以及如何现将结果排序? –

+0

Sergio让我编辑。 abjihit不会工作,因为restaurant_id有自己的顺序。 – lemon

+0

对不起,我不明白你的问题,我打了很简单:Dishes.where(“restaurant_id in(?)”,ids).order(“restaurant_id desc”)。map {| j | j.restaurant_id} – abhijit

回答

2

我在这里可以想到的唯一有效的(我的意思是“推送到数据库”)的事情是通过迭代餐馆ID数组来生成文本,如:

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") 
+0

这有效,但它返回一个数组!我非常需要一个ActiveRecord :: Relation :-(想法? – lemon

+0

您能显示您的修改后的代码吗? –

+0

r = Dish.find_by_sql(“SELECT * FROM dishes WHERE restaurant_id in(4,2,1,3)ORDER BY case restaurant_id当4然后1当2然后2当1然后3当3然后4结束“) – lemon