Active Record的未定义方法?

时间:2014-09-30 15:29:09

标签: sql ruby-on-rails activerecord

这是一个直截了当的问题。我遇到了这个错误

NoMethodError: undefined method where for #<Class:0x00000004eef3c8>

当我尝试执行此ActiveRecord查询时

accounts = Account.where("created_at > #{Date.today.prev_year}").limit(10)

我不明白为什么会这样。我正在尝试从上一年的日期获得带有created_at时间戳的10个项目的数组。

API activerecord docs说明了示例,我的语法似乎正确。此外,轨道指南上的红宝石也提供了此示例Client.where("orders_count = '2'")。我不明白为什么我无法执行查询。有人可以解释一下吗?感谢。

1 个答案:

答案 0 :(得分:4)

“.where”和“.limit”语法不在rails 2.3中。此外,条件是错误的 - Date.today.prev_year将给出时间的字符串版本,如"2013-09-30 16:35:36 +0100"。您需要将它与不同的数据库时间字符串格式进行比较。最好让rails处理转换。

试试这个:

accounts = Account.find(:all, :conditions => ["created_at > ?", 1.year.ago.to_date], :limit => 10)

编辑:顺便说一句,您可以使用

将时间/日期转换为相关的数据库格式
mytime.to_s(:db)

请记住,在数据库中这是有效的字符串比较,所以如果你想把它放在where字符串中,你需要将它包装在引号中。

accounts = Account.find(:all, :conditions => {"created_at > '#{1.year.ago.to_date.to_s(:db)}'"}, :limit => 10)

accounts = Account.find(:all, :conditions => {"created_at > #{1.year.ago.to_date.to_s(:db),inspect}"}, :limit => 10)