在我的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>
但即使存在匹配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
答案 0 :(得分:0)
日期....你可能有一个解析问题,美国/英国格式交换和令人困惑的事情。我经常发现使日期明确无误(假设英国月份):
Cycle.find_by_start("13 May 2011")
答案 1 :(得分:0)
如果:start是日期字段,那么最好将find_by_start传递给实际的Date对象而不是字符串。所以:
Cycle.find_by_start(Date.parse("2011-05-13"))
(我在这里使用Date.parse来创建日期对象,但你也可以使用Date.new或Date.today或其他方法)
将字符串传递给finder方法可能有效,但正如您所发现的那样,可能也不会 - 取决于数据库类型以及数据库如何解释字符串。