Как получить уникальную запись по специальному столбцу из метода where с Rails? - PullRequest
0 голосов
/ 14 сентября 2018

Например, этот метод возвращает записи как:

Post.where(valid: true)
# [
    [0] #<Post:11113892841> { :id => 1, :valid => 1, :user_id => 1},
    [1] #<Post:21113892841> { :id => 2, :valid => 1, :user_id => 2},
    [2] #<Post:31113892841> { :id => 3, :valid => 1, :user_id => 2},
    [3] #<Post:41113892841> { :id => 4, :valid => 1, :user_id => 3},
    ...
]

Хотите получить только уникальные user_id записи как:

[
    [0] #<Post:11113892841> { :id => 1, :valid => 1, :user_id => 1},
    [1] #<Post:21113892841> { :id => 2, :valid => 1, :user_id => 2},
    [2] #<Post:41113892841> { :id => 4, :valid => 1, :user_id => 3},
    ...
]

Как это сделать?

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Хотя вы можете использовать .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">]>
0 голосов
/ 14 сентября 2018

Самый надежный способ сделать это:

Post.where(valid: true).select('distinct(user_id)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...