Отличительный запрос в отношении has_many с ActiveRecord - PullRequest
1 голос
/ 12 апреля 2020

Проблемы с поиском наиболее эффективного способа обработки запросов такого типа.

У меня есть 3 модели:

User, Location и Query

# User
has_many :queries

# Query
belongs_to: :user
belongs_to :location

Я использую user.queries для статистики, так как она содержит дополнительные метаданные, в столбце location_id есть много дубликатов, если они выполняют один и тот же запрос, но у каждого будут разные метаданные, поэтому они записываются как отдельные record.

Я хотел бы создать так называемый history, который выбирает самый последний отдельный location_id из User.queries и возвращает их в порядке id или created_at, сохраняя его как ActiveRecord Collection и не преобразует его в массив, чтобы его можно было повторять для рендеринга.

user.queries.select(:location_id).distinct близко, но не упорядочено.

Появляется следующий необработанный SQL работать, но есть ли способ написать это с ActiveRecord

queries.find_by_sql("
      SELECT location_id, created_at
      FROM (SELECT DISTINCT ON (queries.location_id) *
        FROM queries
        ORDER BY queries.location_id, queries.created_at DESC) queries
      ORDER BY queries.created_at DESC
      LIMIT 20
    ")

1 Ответ

0 голосов
/ 13 апреля 2020

uniq будет как можно ближе

user.queries.order('queries.created_at DESC').pluck(:location_id).uniq
user.queries.select("location_id, queries.created_at").map(&:location_id).uniq
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...