Ruby on rails where(&';数组中的字段)是否总是按顺序返回记录?

Ruby on rails where(&';数组中的字段)是否总是按顺序返回记录?,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,查询是否: company_ids = [2,6,15,1,3] @people = Person.where("company_id IN (?)", company_ids) 是否始终返回按公司ID数组排序的@people 如果不是,最好添加.order()这样的命令: c_ids = company_ids.collect{|c_id| "company_id = #{c_id}"} @people = Person.where("company_id IN (?)", compan

查询是否:

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

@people = Person.where("company_id IN (?)", company_ids)
是否始终返回按
公司ID
数组排序的
@people

如果不是,最好添加
.order()
这样的命令:

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

@people = Person.where("company_id IN (?)", company_ids).order( c_ids.join(',') )
还没测试过,你能试试这个吗

@people = Person.where("company_id IN (?)", company_ids).order("company_id")
这将确保按公司id排序的订单中始终有@people。如果您需要其他内容,请发表评论。

不,没有

您可以在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
---编辑---

在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;")

如果未明确指定排序,则不能保证排序。@SergioTulentsev我试图避免执行不必要排序的性能开销。谢谢您的评论。如果您需要按顺序排列记录,那么您最好对它们进行排序。或者在生产中断时半夜醒来。SergioTulentsev您知道我上面使用的排序方法是否适用于ID数组吗?谢谢:)我很怀疑:)你不是按给定的数组排序
company\u id
,而是按
id
降序,然后收集这些id。这是根据升序的company\u id排序
Person
。我需要company\u id的顺序与
company\u id
数组完全匹配。哦,太酷了,为此,您只需添加“排序依据”,下面是代码
@people=Person.where(“company_id IN(?)、company_id).sort_by{x | company_id.index x.company_id}
我需要
@people
作为排序关系,这是用于PostgreSQL的。添加了一个小怪物般的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;")