Хотя вы можете использовать .distinct
, он будет возвращать только столбец user_id:
irb(main):037:0> Post.select(:user_id).distinct
Post Load (0.6ms) SELECT DISTINCT "posts"."user_id" FROM "posts" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Post id: nil, user_id: 1>]>
Это бесполезно, поскольку вы ничего не можете сделать с набором результатов.
К сожалению, для этой относительно простой проблемы не существует хорошего решения полиглота из-за разницы в интерпретации стандартов SQL.
В MySQL вы можете использовать оператор GROUP BY:
Post.group(:user_id)
Однако это не работает на Postgres .(column "posts.id" must appear in the GROUP BY clause
).Вы могли бы сказать, что единственная причина, по которой это работает на MySQL, это его допуск для потенциально неоднозначных запросов - он не соответствует стандарту SQL 1999 или 2003.
On Postgres , вместо этого следует использовать DISTICT ON(user_id)
, так как не разрешит вышеуказанный запрос:
irb(main):058:0> Post.select("DISTINCT ON (posts.user_id) posts.*")
Post Load (0.9ms) SELECT DISTINCT ON (posts.user_id) posts.* FROM "posts" LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<Post id: 3, user_id: 1, created_at: "2018-09-14 11:46:12", updated_at: "2018-09-14 11:46:12">]>