我有一个站点从外部源获取用户的记录ID和SCORE。
然后我想获取与每个ID的分数排序的ID匹配的记录。
ID和SCORES作为XML进入应用程序,我目前正在解析为数组(哈希):
[{90=>279}, {32=>400}]
如何使用该分数来订购退回的记录?
答案 0 :(得分:1)
src_data = [{90=>279}, {32=>400}]
ids = src_data.sort_by{|hash| hash.values.first}.reverse.collect(&:keys).flatten
# => [32,90]
ids现在应该是一个id数组,按照从最高得分到最低得分的顺序排列。现在我们可以做到了。
@users = User.where("id in (?)", ids).order("ORDER BY FIELD(ID,#{ids.join(',')})")
这应该生成类似
的sqlselect * from users where id in (32,90) ORDER BY FIELD(ID,32,90);
应该以正确的顺序返回给用户。
编辑 - 对于postgres
Postgresql没有field()
功能。您可以定义自己的,请参阅Simulating MySQL's ORDER BY FIELD() in Postgresql,但您可能不会打扰,只需在获得结果后重新排序:
@users = User.where("id in (?)", ids).sort_by{|user| ids.index(user.id)}
答案 1 :(得分:0)
如果它是标准的ruby数组,你应该能够使用" sort_by"对它进行排序。
基于键/值排序的两个例子:
results = [{90=>279}, {32=>400}]
results.sort_by{|result| result.keys[0]}
# => [{32=>400}, {90=>279}]
results.sort_by{|result| result.values[0]}
# => [{90=>279}, {32=>400}]
查看此博客文章,了解有关Ruby中sort_by和sort的更多信息: http://brandon.dimcheff.com/2009/11/18/rubys-sort-vs-sort-by.html