ActiveRecord:查询日期时出现'find'方法问题

时间:2010-05-25 12:34:59

标签: ruby-on-rails ruby activerecord

我在使用SQLite3数据库运行的ActiveRecord模型的'find'方法中遇到日期查询的条件。我的模型如下:

Day:
  failure_day:   date
  failure_count: integer 

当我尝试查询Days时,我得到以下内容(仅限伪代码):

Query:   Days.all
Result:  [{failure_day: 2010-04-14, failure_count: 1}]

Query:   Days.find(:first, :conditions=>'failure_day > 2010-02-01')
Result:  {failure_day: 2010-04-14, failure_count: 1}

Query:   Days.find(:first, :conditions=>'failure_day = 2010-04-14')
Result:  nil

Query:   Days.find(:first, :conditions=>'failure_day < 2010-05-05')
Result:  nil

我无法理解的是为什么最后两个查询返回'nil'。第一个查询(Days.all)证明我的数据库中有一条记录。第二个正确匹配'failure_day'与小于'failure_day'的日期,但是当尝试等于或小于它不起作用时。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

你只提供了伪代码,这使得它变得更难。

您告诉我们您的failure_date列的类型为DATE。让ActiveRecord为您处理细节:

Day.all(:conditions => {:failure_date => Date.today})
Day.all(:conditions => ["failure_date < ?", Date.today])
Day.all(:conditions => {:failure_date => Date.new(1900, 1, 1) .. 5.days.ago})

答案 1 :(得分:0)

你应该使用

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') > '2010-02-01'"])

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') = '2010-04-14'"])

Days.find(:first, :conditions=>["DATE_FORMAT(failure_day, '%Y-%m-%d') < '2010-05-05'"])

答案 2 :(得分:0)

这是对FrançoisBeausoleil评论的回答: “您使用的是什么版本的ActiveRecord,SQLite,Ruby?发布一个会话要点,我们可以看到您在控制台输入的代码以及development.log中的内容”

我把它放在这里是因为我无法在评论中进行格式化,如果没有格式化,这篇文章将会非常难以理解!

SQLite version:       3.6.12
ActiveRecord version: 2.3.5

测试代码:

require 'test_helper'

class StatTest < ActiveSupport::TestCase
  test "Tmp" do
    # Prints: [#<Day id: 980190962, failure_day: "2010-04-14" ... >]
    p Day.all

    # Prints: []
    p Day.all(:conditions=>["failure_day < ?", '2010-05-14'])

    # Prints: []
    p Day.all(:conditions=>["failure_day < ?", Date.new(2010,5,4)])
  end
end

Test.log

Day Load (0.3ms)   SELECT * FROM "days" 
Day Load (0.1ms)   SELECT * FROM "days" WHERE (failure_day < '2010-05-14') 
Day Load (0.1ms)   SELECT * FROM "days" WHERE (failure_day < '2010-05-04') 

直接从SQLite运行任何这些命令会返回预期的行,因此问题不在于ActiveRecord正在生成的SQLite命令。奇异。

答案 3 :(得分:0)

感谢François Beausoleil的探究性问题,我能够找出问题所在。 François提醒我,测试从测试装置加载数据(在我的例子中是test / fixtures / days.yml)。我已经设置了这个,但我认为我最好仔细检查格式。在days.yml文件中,我发现:

one:
  failure_day:   2010/04/14
  failure_count: 1

注意到日期未定义为2010-04-14,因为我将其更改为:

one:
  failure_day:   2010-04-14
  failure_count: 1

现在所有查询都有效!