Я боролся с этим некоторое время, и на данный момент кажется, что вы в значительной степени застряли в генерировании SQL.
Однако у меня есть пара усовершенствований.
Вместо find_by_sql
, как предложил @ Франсуа, я использовал ActiveRecord to_sql
и joins
, чтобы немного "навести" мой SQL:
subquery_sql = Table.select(["MIN(price) as price", :type]).group(:type).to_sql
joins_sql = "INNER JOIN (#{subquery_sql}) as S
ON table.type = S.type
AND table.price = S.price"
Table.joins(joins_sql).where(<other conditions>).order(<your order>)
Как видите, я все еще использую сырой SQL, но, по крайней мере, только в той части, где AR не поддерживает (AFAIK ActiveRecord просто не может управлять INNER JOIN ... ON ...
), а не в целом.
Использование joins
вместо find_by_sql делает запрос цепным - вы можете добавить дополнительные условия, или отсортировать таблицу, или поместить все в область действия.