Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.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
Ruby on rails 日期比较在ActiveRecord中是如何工作的?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 日期比较在ActiveRecord中是如何工作的?

Ruby on rails 日期比较在ActiveRecord中是如何工作的?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我是Rail的新手,正在尝试在ActiveRecord中进行查询。我正在尝试获取所有状态为“已着陆”的记录,这些记录已经超过60天了。我的查询可以得到所有状态为“Landed”的项目。当我添加最后一个条件“created_at[:Project\u status\u histories,:status],:conditions=>{:projects=>{:status\u id=>status.where(:name=>'Landed').first.id},:Project\u status

我是Rail的新手,正在尝试在ActiveRecord中进行查询。我正在尝试获取所有状态为“已着陆”的记录,这些记录已经超过60天了。我的查询可以得到所有状态为“Landed”的项目。当我添加最后一个条件“created_at<?”时,我总是得到一个空的关系。我知道我有符合这个描述的项目,所以我在我的查询中做了一些错误的事情,我不明白。我相信我的错误在于日期比较,但我不确定

1. Projects
    belongs_to :status
    has_many :project_status_histories
2. Status
    has_many :projects
    has_many :project_status_histories
3. Project_Status_Histories
    belongs_to :status
    belongs_to :project

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}})
1。项目
属于:状态
有很多:项目状态历史
2.地位
有很多:项目
有很多:项目状态历史
3.项目状态历史
属于:状态
属于:项目
Project.find(:all,:joins=>[:Project\u status\u histories,:status],:conditions=>{:projects=>{:status\u id=>status.where(:name=>'Landed').first.id},:Project\u status\u histories=>{:created\u at=>[“created\u at<?”,(Date.today-60.days)]}

我已经尝试过用dbconsole一步一步地构建查询,但没有任何运气。提前谢谢你的帮助

您的查询有点复杂

我宁愿这样做:

Project.where("status.name = ? AND project_status_histories.created_at < ?", "Landed", Time.now.day - 60.days)
Project.where(“status.name=”和Project\u status\u histories.created\u at<?”,“Landed”,Time.now.day-60.days)
我认为这应该更有效。如果没有,请告诉我,也许我写错了什么,不幸的是,我现在无法测试它

[编辑]

您可能还想查看生成的SQL是什么,使用“explain”方法,只需将其添加到查询的末尾并打印结果,例如使用查询:

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}}).explain
Project.find(:all,:joins=>[:Project_status_history,:status],:conditions=>{:projects=>{:status_id=>status.where(:name=>'Landed').first.id},:Project_status_history=>{:created_at=>[“created_at<?,(Date.todays-60.days)])解释

您的查询有点复杂

我宁愿这样做:

Project.where("status.name = ? AND project_status_histories.created_at < ?", "Landed", Time.now.day - 60.days)
Project.where(“status.name=”和Project\u status\u histories.created\u at<?”,“Landed”,Time.now.day-60.days)
我认为这应该更有效。如果没有,请告诉我,也许我写错了什么,不幸的是,我现在无法测试它

[编辑]

您可能还想查看生成的SQL是什么,使用“explain”方法,只需将其添加到查询的末尾并打印结果,例如使用查询:

Project.find(:all, :joins => [:project_status_histories, :status], :conditions => {:projects => {:status_id => Status.where(:name => 'Landed').first.id }, :project_status_histories => {:created_at => ["created_at < ?", (Date.today - 60.days)]}}).explain
Project.find(:all,:joins=>[:Project_status_history,:status],:conditions=>{:projects=>{:status_id=>status.where(:name=>'Landed').first.id},:Project_status_history=>{:created_at=>[“created_at<?,(Date.todays-60.days)])解释

我认为这不是日期算法。一种很好的方法是使用命名作用域。将以下内容添加到project.rb:

scope :landed, joins(:status).where('statuses.name' => 'Landed')
scope :recent, lambda \
              { joins(:project_status_histories) \
              .where('project_status_histories.created_at < ?', Date.today - 60.days) } 
这在我的测试中对我起了作用。您还应该查看rails指南,我从中偷走了大部分内容:


我认为这不是日期算术。一种很好的方法是使用命名作用域。将以下内容添加到project.rb:

scope :landed, joins(:status).where('statuses.name' => 'Landed')
scope :recent, lambda \
              { joins(:project_status_histories) \
              .where('project_status_histories.created_at < ?', Date.today - 60.days) } 
这在我的测试中对我起了作用。您还应该查看rails指南,我从中偷走了大部分内容:


是的,作用域视图更清晰,此解决方案比我的要好得多。;)我添加了范围,现在可以单独使用它们,但它们不会链接<代码>作用域:landed,find(:all,:joins=>:status,:conditions=>{:projects=>{:status\u id=>status.where(:name=>'landed')}和
作用域:recent,lambda{joins(:project\u status\u histories.created\u at<?,Date.day-60.day)}
我必须返回一个我不期望的关系。当我在
Project.landed.recent
中链接作用域时,我得到一个“undefined method recent”错误。我删除了我的小测试项目,因此需要一段时间才能测试它,但我猜你的
landed
作用域正在返回一个项目对象数组(因为您使用的是
find
),而
recent
作用域返回一个Arel关系,因此当调用
recent
时,您是在一个项目对象数组上调用它,而不是在一个关系上。在我的示例中,两个作用域都返回关系。您可以通过用我的示例中的代码替换
landed
作用域代码来测试它,并查看发生了什么刚刚注意到,
最近的
范围实际上是在查找旧内容,而不是最近的内容,因此它的名称非常糟糕。很抱歉,我没有仔细阅读。是的,范围视图更干净,这个解决方案比我的好得多。;)我添加了范围,现在可以单独使用它们,但它们不会链接。
范围:landed,find(:all,:joins=>:status,:conditions=>{:projects=>{:status\u id=>status.where(:name=>'Landed')}
scope:recent,lambda{joins(:project\u status\u histories)。其中('project\u status\u histories.created\u at<?',Date today-60.day)}
我必须返回一个我不期望的关系。当我在
Project.landed.recent
中链接作用域时,我得到一个“undefined method recent”错误。我删除了我的小测试项目,因此需要一段时间才能测试它,但我猜你的
landed
作用域正在返回一个项目对象数组(因为您使用的是
find
),而
recent
作用域返回一个Arel关系,因此当调用
recent
时,您是在一个项目对象数组上调用它,而不是在一个关系上。在我的示例中,两个作用域都返回关系。您可以通过用我的示例中的代码替换
landed
作用域代码来测试它,并查看发生了什么刚刚注意到,
最近的
范围实际上是在查找旧的东西,而不是最近的东西,因此它的名称非常糟糕。很抱歉,我没有仔细阅读。更喜欢解决方案