Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用rails跨3个表查找此结果?_Sql_Ruby On Rails - Fatal编程技术网

Sql 如何使用rails跨3个表查找此结果?

Sql 如何使用rails跨3个表查找此结果?,sql,ruby-on-rails,Sql,Ruby On Rails,一个项目有三个表:客户表、发票表、交货表 这些关系是: client has_many invoices client has_many deliveries invoices belongs_to client deliveries belongs_to client 发票和交货模型都有一个日期字段 现在,我想找到在该月内发票或交付中至少有1条记录的所有客户,因此需要发票中有记录或

一个项目有三个表:客户表、发票表、交货表

这些关系是:

             client has_many invoices
             client has_many deliveries


              invoices belongs_to client
              deliveries belongs_to client
发票和交货模型都有一个日期字段

现在,我想找到在该月内发票或交付中至少有1条记录的所有客户,因此需要发票中有记录或交付中有记录或两者都有记录的不同客户

如何使用Rails甚至SQL查找客户机


感谢您的帮助

我将在客户端定义一个方法来检查 交货和发票的日期以x月为单位

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
uniq
调用也会删除返回的所有nil对象


如果在许多ahve发票或交付中只有少数客户端,您可以尝试更快地获取Client.find(:all,:join=>:invoices)+Client.find(:all,:join=>:deliveries)

我将在客户端上定义一个方法,检查 交货和发票的日期以x月为单位

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
uniq
调用也会删除返回的所有nil对象


如果在许多ahve发票或交付中只有少数客户,您可以尝试更快地获取Client.find(:all,:join=>:invoices)+Client.find(:all,:join=>:deliveries)

这将是我的第一次尝试:

Client.all(:include => [:deliveries, :invoices], :conditions => ['(deliveries.date > :start_date) OR (invoices.date > :start_date)', :start_date => 1.month.ago])
理想情况下,我希望在模型中使用命名范围或自定义查找器方法来处理此问题:

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
class客户端[:deliveries,:invoices],:conditions=>['(deliveries.date>:start_date)或(invoices.date>:start_date),:start_date=>date]}
#或
定义self.find_by_delivery_或_invoice_活动
全部(:include=>[:交货,:发票],:条件=>['(deliveries.date>:start\u date)或(invoices.date>:start\u date),:start\u date=>1.month.ago])
结束
结束

我很确定这应该非常接近您的需要,但我不希望它在没有针对您的情况进行一些修改的情况下工作。

这将是我第一次尝试:

Client.all(:include => [:deliveries, :invoices], :conditions => ['(deliveries.date > :start_date) OR (invoices.date > :start_date)', :start_date => 1.month.ago])
理想情况下,我希望在模型中使用命名范围或自定义查找器方法来处理此问题:

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
class客户端[:deliveries,:invoices],:conditions=>['(deliveries.date>:start_date)或(invoices.date>:start_date),:start_date=>date]}
#或
定义self.find_by_delivery_或_invoice_活动
全部(:include=>[:交货,:发票],:条件=>['(deliveries.date>:start\u date)或(invoices.date>:start\u date),:start\u date=>1.month.ago])
结束
结束
我很确定这应该是非常接近你需要的,但我不希望它的工作没有一些修改为您的情况