由delete_all引起的ActiveRecord :: StatementInvalid

时间:2012-06-10 15:13:18

标签: ruby-on-rails sqlite ruby-on-rails-3.1

在我们的rails 3.1.4应用程序中,将使用sys_log模型中的方法删除系统日志中过多的条目:

  def self.trim_log(num_entry)
    if SysLog.count > num_entry      
      SysLog.where("log_date < #{SysLog.all[num_entry -1].log_date}").delete_all
    end
  end

这里num_entry是我们要保留的日志条目。该条目之前的任何条目都将被删除。但是,delete_all会导致rspec中出现以下错误:

 ←[31mFailure/Error:←[0m ←[31mSysLog.trim_log(1)←[0m
 ←[31mActiveRecord::StatementInvalid:←[0m
   ←[31mSQLite3::SQLException: near "03": syntax error: DELETE FROM "sys_logs" WHERE (log_date < 2012-06-10 03:43:21 UTC)←[0m

rails控制台中的错误相同。我们的开发中数据库是sqlite3。 log_date是一个日期时间。我们的代码出了什么问题?非常感谢。

1 个答案:

答案 0 :(得分:1)

尝试:

SysLog.where("log_date < ?", SysLog.all[num_entry -1].log_date).delete_all

正确引用你的约会。

但考虑修改。我想你可以用这种方式获取你的num_entry-1元素:

SysLog.offset(num_entry-1).first

比获取所有这些更有效率。