ActiveRecord :: Dirty and Rake

时间:2012-01-26 15:47:41

标签: ruby-on-rails activerecord rake

我在一个Rails项目中有一个模型(让我们称之为A),它使用ActiveRecord :: Dirty a_changed来检查属性(让我们称之为a)?在before_save上运行。我希望能够在Rake任务中保存A的实例,但只是包括:环境没有削减它 - 我在Rake任务中得到“没有方法a_changed?在A上定义”消息。如何让ActiveRecord记住Rake任务中的ActiveRecord :: Dirty?

Rails版本是2.3.11

namespace :some_namespace do
  namespace :some_subnamespace do
    desc "This is a Rake Task"
    task :some_taskname, [:some_arg] => [:environment] do |t,arg|
      foo = A.find(11111)
      foo.save #<=== fails with "no method a_changed? defined on A"
    end
  end
end

由于这是一堆非常密集的信息,所以这是细分:

  1. 我有一个带有属性a的模型A.
  2. 模型A定义了一个调用a_changed?的before_save触发器,这是一个在Rails环境中由ActiveRecord :: Dirty添加的方法。从控制器调用它没有问题。
  3. 然而,在我的Rake任务中,a_changed?在before_save触发器中调用会导致引发NoMethodError异常,大概是因为[:environment]要求不足以包含ActiveRecord :: Dirty。我的问题是如何使这不发生(我的解决方法是从before_save中解救NoMethodError,这是一个明显的黑客攻击)。

1 个答案:

答案 0 :(得分:0)

您的问题似乎有already been answered on a previous question asked on StackOverflow

为了确定您的对象有哪些方法,您可以这样做:

...
desc "This is a Rake Task"
task :some_taskname, [:some_arg] => :environment do |t, args|
  foo = A.find(11111)
  p foo.methods
...

这将打印出可用方法的列表。如果数组包含:some_attr_changed?(其中some_attr是属性),那么您可以确定ActiveRecord :: Dirty在rake任务中确实正常工作。如果这些方法没有显示在数组中,那么您的假设是正确的。