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

Я пытаюсь показать список полиморфных отношений без дубликатов.

У меня есть таблица StoreViews с полиморфным полем с именем viewable (поэтому в моей таблице есть столбцы viewable_id и viewable_type).Теперь я хочу отобразить представления с каждым полиморфным отношением, отображаемым только один раз, без дубликатов.

@views = StoreView.
    .distinct(:viewable_id)
    .distinct(:viewable_type)
    .order("created_at DESC")
    .limit(10)

Так что, если в StoreView есть две записи, обе с одинаковым отношением просмотра, @views должен возвращать только самые последниеодин.Однако это не так.

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

ORDER BY элементы должны появиться в списке выбора, если указано SELECT DISTINCT.Есть несколько способов обойти эту проблему .

В этом примере использование агрегатной функции должно работать:

@views = StoreView
           .select('DISTINCT viewable_type, viewable_id, MAX(created_at)')
           .group(:viewable_type, :viewable_id)
           .order('MAX(created_at) DESC')
           .limit(10)
0 голосов
/ 27 декабря 2018

distinct принимает только логическое значение в качестве параметра, чтобы указать, должны ли записи быть уникальными или нет.Так что distinct(:viewable_id) эквивалентно distinct(true) и не делает то, что вы хотите.Вместо использования distinct следует использовать group, который возвращает массив с различными записями, основанными на атрибуте группы.Чтобы вернуть самый последний, кроме порядка (с order) по created_at, вам необходимо добавить поля в group:

@views = StoreView
         .order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
         .group(:viewable_id, :viewable_type)

Если вам нужночтобы получить возвращенные записи, упорядоченные по created_at, вам необходимо добавить это.

0 голосов
/ 21 декабря 2018

ActiveRecord Different:

https://apidock.com/rails/ActiveRecord/QueryMethods/distinct

Указывает, должны ли записи быть уникальными или нет.Например:

User.select(:name)
# => Might return two records with the same name

User.select(:name).distinct
# => Returns 1 record per distinct name

Как насчет этого:

@views = StoreView
    .select(:viewable_id, :viewable_type)
    .distinct
    .order("created_at DESC")
    .limit(10)

Вы также можете попробовать

@views = StoreView
    .select('DISTINCT `viewable_id`, `viewable_type`')
    .order("created_at DESC")
    .limit(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...