2013-10-06 2 views
0

Я выполняю периодическую задачу рейка, чтобы обновлять атрибуты в моей модели User. Я хотел бы выполнить Mailer, если определенный атрибут изменился, но я не могу вызывать модуль attribute_changed?, так как он не знает экземпляр запроса - обычно вы делаете это в модели с обратным вызовом after_save.Запрос измененных атрибутов модели в задаче rake

Так что у меня это:

task :my_task => :environment do  
    User.all.each do |user| 

    @howmanythings = user.things.size 
    user.update_attribute(:total_things, @howmanythings) 

    user.save 

    //THIS IS THE BIT THAT DOES NOT WORK: 

    if user.total_things_changed? == true 
     SEND MAILER 
    end 

    end  
end 

На данный момент пользователь. total_things_changed? возвращает false, вне зависимости от того, обновила ли этот файл атрибут rake. Короче говоря, как мне выполнить обратный вызов after_save (или эквивалент) внутри задачи? Спасибо заранее.

ответ

0

ActiveRecord::Dirty tracks несохраненный атрибут изменений. В тот момент, когда вы сохраните модель, начнут возвращаться методы foo_changed?false.

Отметьте, что update_attribute сохраняет модель.

Вы могли бы сделать что-то вроде

@howmanythings = user.things.size 
user.total_things = user.things.size 

if user.total_things_changed? == true 
    # SEND MAILER 
end 

user.save 

, чтобы заставить его работать, как вы ожидаете.

Смежные вопросы