Разделите ваш запрос на две части.В первом найдите максимальную ревизию для каждого имени.Во втором запросе найдите полную строку, которая соответствует имени и ревизии.
CREATE TEMP TABLE max_revisions (name varchar, revision integer);
INSERT INTO max_revisions SELECT name, max(revision) FROM revisions
WHERE saved = 1 GROUP BY name;
SELECT r.* FROM revisions r INNER JOIN max_revisions m
ON m.name = r.name AND m.revision = r.revision;
Теперь ваша проблема может состоять в том, как выразить это в Rails.
Вы можете использовать Revision.connection.executeа затем Revision.find_by_sql (оба в одном методе, например: Revision.find_by_max_revisions).
В противном случае, если ваша база данных не поддерживает временные таблицы или вы просто не хотите их использовать, вы можете прочитатьmax_revisions в память, а затем использовать его для построения запроса:
class Revision
def self.find_by_max_revisions
max_revs = connection.select_values(
sanitize_sql(
["SELECT name, max(revision) as max_rev FROM #{table_name}
WHERE saved = ? GROUP BY name", 1]
), "Load max_revisions for #{self.name}"
)
max_revs.map do |row|
find_by_name_and_revision(row["name"], row["max_rev"].to_i)
end
end
end