Сортировать многомерный массив на основе второго массива в Ruby - PullRequest
1 голос
/ 18 марта 2012

У меня есть массив [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}

Это хорошо работает.Однако возвращенные модели находятся в том порядке, в котором они появляются в базе данных, а не в порядке, указанном ключами.Это означает, что выходные данные сортируются случайным образом, а не в порядке среднего балла.

Должен быть какой-то способ переупорядочения многомерного массива, возвращаемого Review.where на основе массива @keys .. или какой-то способ извлечения записей в правильном порядке ... возможно, используя цикл вокругSQL-запрос?

Спасибо за помощь !!

Ответы [ 2 ]

1 голос
/ 18 марта 2012

Вы можете оптимизировать свои первые два оператора, чтобы использовать сортировку БД, поскольку функции группы 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 - это упорядоченный массив массивов.Внутренний массив имеет среднюю оценку и отзывы.

1 голос
/ 18 марта 2012

Я бы не знал о 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...