2012-01-26 2 views
0

У меня есть модель (назовем ее A) в проекте Rails, который проверяет атрибут (назовем его a) с помощью ActiveRecord :: Dirty a_changed? функция before_save. Я хочу сохранить экземпляр задачи A в Rake, но просто включаю: среда не режет ее - я получаю сообщение «no method a_changed? Defined on A» в задаче Rake. Как получить ActiveRecord, чтобы помнить об ActiveRecord :: Dirty в рамках задачи Rake?ActiveRecord :: Dirty and Rake

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. У меня есть модель А с атрибутом а.
  2. Модель A имеет триггер before_save, который вызывает a_changed ?, который является методом, добавленным ActiveRecord :: Dirty в среде Rails. Нет проблем с вызовом этого контроллера.
  3. В моей игре Rake, однако, a_changed? вызов в вызове before_save вызывает исключение NoMethodError, предположительно потому, что требование [: environment] недостаточно для включения ActiveRecord :: Dirty. Мой вопрос заключается в том, как сделать так, чтобы это не произошло (моим обходным решением является спасение NoMethodError изнутри before_save, что является очевидным взломом).

ответ

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 действительно отлично работает в задаче грабли. Если эти методы не отображаются в массиве, ваши предположения верны.

+0

Это не так близко к тому, что я прошу. Передача аргументов проста. Он обращается к blah_changed? ActiveRecord :: Грязный метод на моем экземпляре модели, который я не могу сделать. Я посмотрю, смогу ли я прояснить вопрос. –

+0

Извините, что это не то, что вы ищете, но ваш оригинальный вопрос заставил вас казаться, что у вас возникли проблемы с доступом к синтаксису. При этом нет необходимости уменьшать мой ответ. Только пытаюсь помочь. Кроме того, если вы попытаетесь добавить строку к своей задаче так: 'p A.ancestors', вы увидите, что класс действительно наследует от' ActiveRecord :: AttributeMethods :: Dirty' и 'ActiveModel :: Dirty', поэтому очевидно, что он наследует методы из этих модулей. Я пытался помочь. Я просто попробовал тот же случай, который у вас есть, и это сработало для меня. – Batkins

+0

См. Отредактированный ответ выше. – Batkins