Как использовать рельсы, чтобы найти этот результат в 3 таблицах? - PullRequest
0 голосов
/ 10 июня 2009

Проект имеет 3 таблицы: клиент, счета, поставки

Отношения:

             client has_many invoices
             client has_many deliveries


              invoices belongs_to client
              deliveries belongs_to client

Как в счетах, так и в модели поставки есть поле даты.

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

Как найти клиентов, использующих Rails или даже SQL?

Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

Я бы определил метод на клиенте, который проверяет, дата в месяце х для поставок и счетов

def has_invoice_in_month(year, month)
   start_date = Date.new(year, month, 1)
   end_date = Date.new(year, month, -1)
   invoices.each do |invoice|
     return true if start_date < invoice.date and end_date > invoice.date
   end
end

Теперь вы перебираете клиентов и собираете их всех вместе

Client.find(:all).collect { |c| c if c.has_invoice_in_month(y,x) or
 c.has_delivery_in_month(y,x))}.uniq

Вызов uniq удаляет также все возвращаемые ноль объекты

Если только несколько клиентов из множества существующих счетов или доставок, вы можете попробовать, если быстрее получить Client.find (: all,: join =>: invoices) + Client.find (: all,: join => : поставки)

1 голос
/ 10 июня 2009

Это будет мой первый треск:

Client.all(:include => [:deliveries, :invoices], :conditions => ['(deliveries.date > :start_date) OR (invoices.date > :start_date)', :start_date => 1.month.ago])

В идеале я хотел бы использовать named_scope или метод пользовательского поиска в модели для обработки этого:

class Client < ActiveRecord::Base
   named_scope :active_since, lambda {|date| {:include => [:deliveries, :invoices], :conditions => ['(deliveries.date > :start_date) OR (invoices.date > :start_date)', :start_date => date]}}

  # or
  def self.find_by_delivery_or_invoice_activity
    all(:include => [:deliveries, :invoices], :conditions => ['(deliveries.date > :start_date) OR (invoices.date > :start_date)', :start_date => 1.month.ago])
  end
end

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

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