У меня есть модель (назовем ее 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
Поскольку это довольно плотный пучок информации, вот разбивка:
- У меня есть модель А с атрибутом а.
- Модель A имеет триггер before_save, который вызывает a_changed ?, который является методом, добавленным ActiveRecord :: Dirty в среде Rails. Нет проблем с вызовом этого контроллера.
- В моей игре Rake, однако, a_changed? вызов в вызове before_save вызывает исключение NoMethodError, предположительно потому, что требование [: environment] недостаточно для включения ActiveRecord :: Dirty. Мой вопрос заключается в том, как сделать так, чтобы это не произошло (моим обходным решением является спасение NoMethodError изнутри before_save, что является очевидным взломом).
Это не так близко к тому, что я прошу. Передача аргументов проста. Он обращается к blah_changed? ActiveRecord :: Грязный метод на моем экземпляре модели, который я не могу сделать. Я посмотрю, смогу ли я прояснить вопрос. –
Извините, что это не то, что вы ищете, но ваш оригинальный вопрос заставил вас казаться, что у вас возникли проблемы с доступом к синтаксису. При этом нет необходимости уменьшать мой ответ. Только пытаюсь помочь. Кроме того, если вы попытаетесь добавить строку к своей задаче так: 'p A.ancestors', вы увидите, что класс действительно наследует от' ActiveRecord :: AttributeMethods :: Dirty' и 'ActiveModel :: Dirty', поэтому очевидно, что он наследует методы из этих модулей. Я пытался помочь. Я просто попробовал тот же случай, который у вас есть, и это сработало для меня. – Batkins
См. Отредактированный ответ выше. – Batkins