find_by_foo无法在Rails 3中返回一些记录但不是其他记录

问题描述

|| 在我的Rails应用程序中,我有一个名为Cycle的模型,该模型的\“ start \”属性一个日期。我遇到了一个非常奇怪的问题,有时
Cycle.find_by_start
将返回期望的记录,但在其他时候它将返回
nil
。 例如,
Cycle.find_by_start(\"2011-05-01\")
返回以下内容
=> #<Cycle id: 45,created_at: \"2011-05-15 22:38:35\",updated_at: \"2011-05-15 22:38:35\",user_id: 20,start: \"2011-05-01\",ending: nil,startguess: false,endingguess: nil>
但是,即使有记录具有匹配的
start
值,运行
Cycle.find_by_start(\"2011-05-13\")
也会返回
nil
。我已经通过在Rails控制台上运行以下命令来验证该记录是否存在并且起始值匹配。
irb(main):012:0> Cycle.find(47)
=> #<Cycle id: 47,created_at: \"2011-05-23 01:28:59\",updated_at: \"2011-06-21 00:38:34\",user_id: 12,start: \"2011-05-13\",ending: \"2011-05-31\",endingguess: false>

irb(main):011:0> Cycle.find(47).start == \"2011-05-13\".to_date
=> true
可能相关的信息:在开发模式下使用sqlite数据库运行Rails 3.0.7。 有任何想法或疑难解答提示吗? 编辑1 使用的SQL查询的日志:
[94m19:10:11 active_record [37mCycle Load (1.0ms)  SELECT \"cycles\".* FROM \"cycles\" WHERE \"cycles\".\"start\" = \'2011-05-01\' LIMIT 1
[94m19:10:19 active_record [37mCycle Load (0.0ms)  SELECT \"cycles\".* FROM \"cycles\" WHERE \"cycles\".\"start\" = \'2011-05-13\' LIMIT 1
    

解决方法

        日期...。您可能遇到解析问题,因为美国/英国格式被交换并且使事情变得混乱。我经常发现使日期明确(假设英语月份为零)是有帮助的:
Cycle.find_by_start(\"13 May 2011\")
    ,        如果:start是日期字段,那么最好传递find_by_start一个实际的Date对象而不是一个字符串。所以:
Cycle.find_by_start(Date.parse(\"2011-05-13\"))
(我在这里使用Date.parse创建日期对象,但您也可以使用Date.new或Date.today或其他方法) 将字符串传递给finder方法可能有用,但是,正如您所发现的那样,可能也行不通-取决于数据库类型和数据库如何解释字符串。