通过外部计算得分

时间:2015-08-25 15:15:54

标签: ruby-on-rails activerecord

我有一个站点从外部源获取用户的记录ID和SCORE。

然后我想获取与每个ID的分数排序的ID匹配的记录。

ID和SCORES作为XML进入应用程序,我目前正在解析为数组(哈希):

[{90=>279}, {32=>400}] 

如何使用该分数来订购退回的记录?

2 个答案:

答案 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(',')})")

这应该生成类似

的sql
select * 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