Как сделать заказ по последней вложенной модели созданной в запросе - PullRequest
0 голосов
/ 08 октября 2018

У меня есть вопрос, я не знаю, возможно ли это, но предположим, что эти модели

class Event < ApplicationRecord
  has_many :gifs
end

class Gif < ApplicationRecord
  belongs_to :event
end

пустая база данных, используя rails console, вы делаете это

gif_1 = Gif.create
gif_2 = Gif.create
gif_3 = Gif.create
event_1 = Event.new
event_1.gifs = [gif_1, gif_3]
event_1.save
event_2 = Event.new
event_2.gifs = [gif_2]
event_2.save

Как бы вы упорядочили события по атрибуту created_at их последних созданных gif-файлов.

Вот пример того, что я пробовал, но это не дает правильного результата

ordered_events = Event.includes(:gifs).joins(:gifs).order("gifs.created_at DESC")
ordered_events.first.id
=> 2 # I want this to return 1

СейчасЯ понимаю, почему моя попытка, вероятно, не сработала.Я думаю, это потому, что он, вероятно, только посмотрел на первый Gif, чтобы выполнить упорядочение.

Кроме того, у меня была еще одна мысль, и здесь я понятия не имею, с чего начать пытаться сделать это в запросе., но что, если Event имеет 0 Gif, из того, что я написал, кажется, что никакие гифки просто не отсылают эти события за теми, у кого есть гифки, но это не сработает для меня.

вот еще одинконтекст в rails console, который более реалистичен, так как обычно вам сначала нужно событие для хранения Gif

event_1 = Event.create
event_2 = Event.create
gif_1 = Gif.create(event_id: event_1.id)
gif_2 = Gif.create(event_id: event_2.id)
event_1 = Event.create
gif_3 = Gif.create(event_id: event_1.id)

Теперь здесь то, что я хотел бы получить из своего запроса, было бы чем-то вроде[event_1, event_3, event_2], потому что, поскольку у event_3 нет картинок, я хочу использовать его created_at для заказа.

Я знаю, как я мог бы сделать это вручную с помощью какой-либо вспомогательной функции или другой, но я бы очень хотелчтобы иметь возможность подобного рода вещи в одном запросе напрямую.

1 Ответ

0 голосов
/ 08 октября 2018

В качестве примера:

Event.joins(:gifs)
     .group('events.id')
     .order('MAX(gifs.created_at) DESC')

Этот запрос занимает events, объединяет их с gifs, группирует по event.id (чтобы исключить дубликаты событий в случае, если одно событие имеет несколько изображений) и сортируетрезультат по последнему (максимальному) created_at времени gif-файлов события в порядке убывания.

Поскольку он использует метод joins, который разворачивается в INNER JOIN в запросе SQL, события без gif-файлов возвращаться не будутпо этому запросу.Чтобы исправить это, используйте left_outer_joins:

Event.left_outer_joins(:gifs)
     .group('events.id')
     .order('MAX(gifs.created_at) DESC')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...