Как бы вы объединили две записи, принадлежащие одной записи, без N + 1? - PullRequest
1 голос
/ 04 февраля 2012

У меня есть приложение, в котором предприятия могут подавать налоги и запрашивать налоговые льготы. (Расширением является запрос, говорящий «Мне нужно больше времени для подачи файла».)

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

Business has_many :tax_filings (one per year)
TaxFiling belongs_to :business

Business has_many :tax_extensions (one per year)
TaxExtension belongs_to :business

Когда я показываю список налоговых деклараций, я хочу, чтобы каждая регистрация показывала, есть ли соответствующее расширение для него. Но я не уверен, как это сделать без запроса N + 1.

Прямо сейчас у меня есть этот метод на TaxFiling:

def extension
  TaxExtension.where(:business_id => business_id, :year => year).first
end

Так что каждый раз, когда я звоню TaxFiling#extension, он выполняет другой запрос к базе данных.

Я добавил область действия для TaxFiling, что joins расширения для business_id и year, но я не уверен, как заставить TaxFiling#extension использовать это, не имея заявленных отношений между двумя моделями.

Как я могу это сделать?

1 Ответ

1 голос
/ 04 февраля 2012

Я думаю, что вам нужен метод .includes для быстрой загрузки, когда вы изначально загружаете модели TaxFiling. Если вы делаете что-то вроде этого:

TaxFiling.includes(:business => [:tax_extensions])

Rails загрузит связанные с ним предприятия и расширения в память, используя три запроса (по одному на модель) вместо N запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...