基于Ruby中的第二个数组对多维数组进行排序

时间:2012-03-18 10:31:03

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord

我有数组[5, 3, 1, 4],它对应于以下代码生成的散列键:

@ordered_hash = Review.group('aidmodel_id').average('score')
@ordered_hash = ActiveSupport::OrderedHash[@ordered_hash.sort_by {|key, value| value }]
@keys = @ordered_hash.keys

使用获得的密钥@keys = [5, 3, 1, 4]我想使用以下方法从我的数据库中提取一些记录:

@reviews = Review.where(:aidmodel_id=>@keys).uniq_by {|x| x.aidmodel_id}

这很有效。但是,返回的模型按它们出现在数据库中的顺序排列,而不是按键指定的顺序排列。这意味着输出是随机排序的,而不是按平均分数的顺序排序。

必须有一些方法可以基于@keys数组重新排序Review.where返回的多维数组..或者以某种方式将记录拉出正确的顺序..也许使用围绕SQL查询的循环?

感谢您的帮助!!

2 个答案:

答案 0 :(得分:1)

我不知道Ruby,但在PostgreSQL中你可以按照要求的顺序获取数组元素:

SELECT arr[i] AS arr_element
FROM  (SELECT '{1,2,3,4,5}'::int[] AS arr, unnest(ARRAY[5, 3, 1, 4]) AS i) x

答案 1 :(得分:1)

您可以优化前两个语句以使用数据库排序,因为rails组函数返回OrderedHash

# you can order the result set by the select col position instead of name
avg_scores  = Review.average(:score, :group => :aidmodel_id, :order => "2 ASC")
# assuming you don't have 100s of rows here..
rh = Review.where(:aidmodel_id=> @avg_scores.keys).group_by(&:aidmodel_id)
avg_score_set = avg_scores.map {|id, score| [id, score, rh[id]]}

现在avg_score_set是一个有序的数组数组。内部阵列具有平均得分和评论。