ActiveRecord :: Грязные и грабли - PullRequest
0 голосов
/ 26 января 2012

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

1 Ответ

0 голосов
/ 26 января 2012

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

...