Я добавил фильтр before_create в одну из моих моделей Rails ActiveRecord, и внутри этого фильтра я выполняю некоторые обновления базы данных.
Иногда я возвращаю false из фильтра, чтобы предотвратить создание целевой модели, но это приводит к тому, что все другие изменения базы данных, которые я сделал (находясь внутри фильтра), свернуты назад.
Как я могу предотвратить это?
Обновление №1: вот псевдокод, объясняющий мою проблему:
class Widget < ActiveRecord::Base
before_create :update_instead
def update_instead
if some_condition?
update_some_record_in_same_model # this is getting rolled back
return false # don't create a new record
else
return true # let it continue
end
end
end
Обновление №2. Несколько хороших ответов ниже, но у каждого есть свои недостатки. В итоге я переопределил метод create следующим образом:
def create
super unless update_instead? # yes I reversed the return values from above
end