find_by_foo无法在Rails 3中返回某些记录(但不返回其他记录)

时间:2011-06-21 22:34:06

标签: ruby-on-rails ruby-on-rails-3 activerecord

在我的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

2 个答案:

答案 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方法可能有效,但正如您所发现的那样,可能也不会 - 取决于数据库类型以及数据库如何解释字符串。