Как записать условия на / с присоединяемой таблицей? - PullRequest
2 голосов
/ 13 апреля 2020

Существует две модели Ticket и Account. В аккаунте много билетов. Я пытаюсь получить последний созданный тикет для каждой учетной записи.

accounts = Account.where(:deleted => false).pluck(:id)    
tickets = Ticket.left_outer_joins(:account)
    .where(:account_id => accounts)
    .order(created_at: :desc)

  ticket_ids = Array.new
  accounts.each do |account|
    ticket = tickets.where(:account_id => account).order(created_at: :desc).limit(1).first
    if !ticket.blank?
      ticket_ids.push(ticket.id)
    end
  end

  @tickets = tickets.where(:id => ticket_ids).order(created_at: :desc)

Приведенный выше код работает, и @tickets содержит ожидаемый результат. Но проблема в том, что приведенный выше код занимает так много времени. Есть ли способ сделать все это в самом запросе на выборку? или есть ли способ оптимизировать его?

База данных, которую я использую: Mysql

Ответы [ 2 ]

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

Я бы попытался решить эту проблему с помощью подзапроса.

ticket_ids = Ticket
  .select('MAX(tickets.id)')
  .joins(:account)
  .where(accounts: { deleted: false })
  .group(account_id)

@tickets = Tickets
  .where(id: ticket_ids).order(created_at: :desc)
0 голосов
/ 13 апреля 2020
ticket_ids = Ticket.order(created_at: :desc).group_by(&:account_id).values
@tickets = Ticket.where(id: ticket_ids)
...