У меня есть таблица с (между прочим) именем и званием. Я хотел бы вернуть набор всех уникальных имен, но для каждого возвращаемого имени я хотел бы выбрать строку с самым высоким рангом. Это просто с двумя вложенными ЗЕЬЕСТ:ActiveRecord вложен SELECT - могу ли я сделать это без ручного SQL?
SELECT * FROM (SELECT * FROM foo ORDER BY rank DESC) AS ordered GROUP BY name
MySQL принимает первый «удар» для каждого имени, которое (из ранее ORDER BY) всегда будет самым высокопоставленным один.
Теперь, если я хочу подключиться к этой таблице с помощью ActiveRecord, я немного потеряю. Я мог бы просто выбросить это в find_by_sql
, но это просто чувствует себя грязным. Я пытался что-то вроде
result = foo.all
result.delete_if do |item|
isOutranked = false
result.each do |row|
if (row.name == item.name) and (row.rank > item.rank) then isOutranked = true
end
isOutranked
end
Я думаю, что работает, но он все еще чувствует, что должен быть лучший способ. Разрешить его либо с помощью обманки ActiveRecord, либо более элегантное манипулирование массивами было бы очень желанным!