Ruby on rails RubyonRails:无需排序即可查找记录
我需要按照作为搜索参数传入的确切顺序查找记录 例如,我有一个字符串:Ruby on rails RubyonRails:无需排序即可查找记录,ruby-on-rails,ruby,sorting,find,Ruby On Rails,Ruby,Sorting,Find,我需要按照作为搜索参数传入的确切顺序查找记录 例如,我有一个字符串: item_list = "23,12,54,45" 通过下面的查询,我获得asc顺序为“item_list”-“12,23,45,54”的记录 如何修改上述查询,使其以与“item_list”相同的顺序返回记录 谢谢。试试这个,尽管它可能只在MySQL中工作: Inventory.where("id IN (#{item_list})").order("find_in_set(id, '#{item_list}')") 对
item_list = "23,12,54,45"
通过下面的查询,我获得asc顺序为“item_list”-“12,23,45,54”的记录
如何修改上述查询,使其以与“item_list”相同的顺序返回记录
谢谢。试试这个,尽管它可能只在MySQL中工作:
Inventory.where("id IN (#{item_list})").order("find_in_set(id, '#{item_list}')")
对于较小的数据集,您可以让Ruby对结果进行排序,但我认为,对于较大的数据集,最好让数据库为您进行排序。在客户端进行排序,如下所示:
item_list.split(",").collect do |item|
Inventory.find(item)
end
ids = item_list.split(',')
items = Inventory.find(ids).sort_by { |i| ids.index(i.id) }
这只使用一个查询,并且只为每个项目计算一次块,这样零件就不会那么昂贵。如果您有很多项要处理,那么您可以轻松构建一个哈希,将id映射到其索引,并在sort\u by
块中使用它
基本思想是使用另一个数组的结构对一个数组进行排序,例如:
>> a = [ 23, 11, 42, 5 ]
>> b = [5, 23, 11, 42]
>> b.sort_by { |i| a.index(i) }
=> [23, 11, 42, 5]
您计划返回的最大数据集是什么?不应该收集而不是每个数据集吗?@Christopher:可以;取决于你想做什么。一般来说,你可能是对的。阿伦:是的,没错。但它确实解决了手头的问题,尽管可能不如你的方式有效。
ids = item_list.split(',')
items = Inventory.find(ids).sort_by { |i| ids.index(i.id) }
>> a = [ 23, 11, 42, 5 ]
>> b = [5, 23, 11, 42]
>> b.sort_by { |i| a.index(i) }
=> [23, 11, 42, 5]