Rails 5 left_outer_join с определенным сохраненным идентификатором - PullRequest
0 голосов
/ 24 мая 2019

У меня есть система со следующими моделями

class Application < ApplicationRecord
  has_many :offers, dependent: :destroy
  belongs_to :accepted_offer, class_name: 'Offer', 
                              foreign_key: 'accepted_offer_id',
                              optional: true
class Offer < ApplicationRecord
  belongs_to :application

, и я создавал отчет, который собирает все предложения по accepted_offer_id, как, например,

Application.find_each do |app|
  offer = Offer.find(app.accepted_offer_id) if app.accepted_offer_id
  report.push(report_body(app, offer))
end

Этостановясь слишком медленным, я хотел бы переписать бит отчета так, чтобы он использовал левое соединение, чтобы установить соединение с одиночным запросом к БД.

Я хотел бы, чтобы запрос возвращал все предложения, которые хранятсякак accepted_offer_id в таблице приложений.

Offer.left_outer_joins(:applications).where(id: { 'application.accetped_offer_id' })

Я знаю, что вышеприведенное неверно, но я уверен, что можно получить коллекцию одним запросом?

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

Что-нибудь подобное?

class Offer < ApplicationRecord
  belongs_to :application

  scope :accepted, -> { joins(:application).where('offers.id = applications.accepted_offer_id') } 
end

Offer.accepted
1 голос
/ 24 мая 2019

Чтобы переписать первый бит немного лучше:

Application.find_each do |app|
  report.push(report_body(app, app.accepted_offer)) if app.accepted_offer
end

Переходя к переписыванию SQL, я почти уверен, что вам нужно сделать:

Offer.joins(:application).where('offers.id = applications.accepted_offer_id')
0 голосов
/ 24 мая 2019

Вы также можете использовать подзапрос.

offer_ids = Application.select(:accepted_offer_id)
offers = Offer.where(id: offer_ids)

Должно привести к (MySQL):

SELECT `offers`.*
FROM `offers`
WHERE `offers`.`id` IN (
  SELECT `applications`.`accepted_offer_id`
  FROM `applications`
)
...