我有数组[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查询的循环?
感谢您的帮助!!
答案 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是一个有序的数组数组。内部阵列具有平均得分和评论。