Я бы определил метод на клиенте, который проверяет,
дата в месяце х для поставок и счетов
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 => : поставки)