.where('字段IN(?)',数组)是否总是按顺序返回记录?

时间:2014-09-24 16:00:18

标签: ruby-on-rails rails-activerecord

查询:

company_ids = [2,6,15,1,3]

@people = Person.where("company_id IN (?)", company_ids)

总是返回@peoplecompany_ids数组排序?

如果没有,最佳做法是添加.order()之类的:

c_ids = company_ids.collect{|c_id| "company_id = #{c_id}"}

@people = Person.where("company_id IN (?)", company_ids).order( c_ids.join(',') )

3 个答案:

答案 0 :(得分:0)

@people = Person.where("company_id IN (?)", company_ids).order(id: :desc).map(&:id)

未经测试可以试试这个。

答案 1 :(得分:0)

不,它没有。

您可以在SQL中执行此操作,但查询语法将取决于您使用的数据库。对于MySQL,这样的事情应该有效:

@people = Person.where("company_id IN (?)", company_ids).order("field(company_id, #{company_ids.join(',')})")

我认为在PostgreSQL中有一种简单的方法可以做到这一点,但除非你有数百万行,否则你可以在Ruby中进行排序:

index = Person.where("company_id IN (?)", company_ids).group_by(&:company_id)
@people = company_ids.map{|id| index[id]}.flatten

--- --- EDIT

你可以在PostgreSQL中做同样的事情:

Person.where("company_id IN (?)", company_ids).order("CASE #{company_ids.map{|id| "WHEN company_id='#{id}' THEN #{company_ids.index(id)}"}.join(' ')} END;")

答案 2 :(得分:-1)

@people = Person.where("company_id IN (?)", company_ids).order("company_id")

这将确保您通过company_id在订单中始终拥有@people。如果您有其他想法,请发表评论。