Подтвердить что ты не робот

Rails: Как запустить before_update только для одного измененного атрибута?

В моей модели Shop я сохраняю URL-адрес изображения в logo_ori и использую его для создания эскизов с помощью before_update.

# shop.rb
before_update :run_blitline_job

private

def run_blitline_job
  # uses logo_ori to make thumbnails
end

Однако я узнал, что когда я сохраняю другие атрибуты (например: редактирование профиля магазина в форме), он также запускает before_update. Как ограничить его выполнение, когда сохраняется только logo_ori?

Я пробовал это:

before_update :run_blitline_job, :if => :logo_ori?

но он все еще работает before_update, если у меня уже есть logo_ori, сохраненный ранее.

4b9b3361

Ответ 1

before_update :run_blitline_job, :if => :logo_ori_changed?

Это вызовет обратный вызов каждый раз, когда изменяется атрибут logo_ori. Вы также можете использовать строки для реализации нескольких условных выражений:

before_update :run_blitline_job, :if => "!logo_ori_was && logo_ori_changed?"

Ответ 3

его просто вы можете использовать ActiveModel:: Dirty (проверить документацию), он доступен во всех моделях в rails 3

before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }