我有一个表A(:name, :address, :country_id)
。我运行这个查询
ids = [1,2,3]
@result = A.where(country_id: ids)
但是,我想按照这个顺序得到结果:records containing country_id = 2 first, then 1 and then 3
.
我应该如何写这个查询?
编辑:
@people = []
@result.each do |r|
@people.push([r,r.name])
end
我现在有一个数组@people of arrays,我想对它排序。现在的查询应该是什么?
另一个编辑:
@people.sort_by! {|p| preferred_order.index(p.first.country_id)}
这个工作。
您可以使用sort_by
:
ids = [1,2,3]
preferred_order = [2,1,3]
@result = A.where(country_id: ids)
@result.sort_by! { |u| preferred_order.index(u.country_id) }
一个选项是添加一个额外的列
rails g migration add_sortorder_to_A sort_order:integer
然后加上
before_save :update_sort_order
def update_sort_order
if self.country_id == 1
self.update_attributes(sort_order:2)
elsif self.country_id ==2
self.update_attributes(sort_order:1)
........
end
或者,将您的sort_order放在国家中,并按其排序。
或者,创建一个动态字段,它会给你sort_order。
可能有一种更优雅的方法来做到这一点,但这应该以一种快速而肮脏的方式工作,并允许您使用标准的activerecord查询和排序。(也就是说,一旦你做了一次,你就可以忘记它)