Как создать активный поиск записей по моделям на 3 уровня? - PullRequest
0 голосов
/ 22 июня 2011

Хорошо, база данных оказывается моим слабым звеном.

У меня есть 3 модели, которые я пытаюсь найти: Пользователь, Счет, Оплата

Счета пользователя user_many и платежи по счету has_many.

Я пытаюсь создать поиск, который найдет все платежи для current_user за указанный диапазон дат.

Вот как я это сделал до сих пор

invoices = current_user.invoices
payments = invoices.inject([]) {|arr,x| arr += x.payments.where("payment_date <= ? and payment_date >= ?", '2011-02-01', '2011-01-01')}

Это кажется мне безумным. Я уверен, что должен быть способ получить это из базы данных напрямую, без перебора результатов. Есть идеи? Ура заранее!

1 Ответ

4 голосов
/ 22 июня 2011

Вы должны использовать что-то вроде:

Payments.joins(:invoice => :user).where("users.id = ? AND (payments.payment_date <= ? and payments.payment_date >= ?)", current_user.id, '2011-02-01', '2011-01-01')

Возможно, вы хотите прочитать Руководства по Ruby On Rails о запросе активной записи

UPDATE

Из приведенного руководства более понятный синтаксис будет:

time_range = (Time.now.midnight - 1.month)..Time.now.midnight
Payments.joins(:invoice => :user).where(:users => {:id => current_user.id}, :payments => {:payment_date => time_range})

ОБНОВЛЕНИЕ 2, другое решение:

В вашей модели User:

has_many :payments, :through => :invoices

Для выполнения запроса:

time_range = (Time.now.midnight - 1.month)..Time.now.midnight
current_user.payments.where(:payment_date => time_range)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...