find_by_foo未能返回Rails3中的一些记录(但不能返回其他记录)



在我的Rails应用程序中,我有一个名为Cycle的模型,它的"开始"属性是一个日期。我遇到了一个非常奇怪的问题,有时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>

但是运行Cycle.find_by_start("2011-05-13")会返回nil,即使存在具有匹配start值的记录。我已经通过在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", startguess: false, 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方法可能有效,但正如您所发现的,也可能无效——这取决于数据库类型和数据库如何解释字符串。

最新更新