2011-01-15 4 views
1

У меня есть модель (закладка) с двумя полями, назовите их A и B. При создании новой модели мне нужно выполнить довольно сложную проверку на B и, если true обновить Закладка в базе данных (установка A на тот, который передается) и прервать создание, если false просто сохраните его и создайте новую закладку.Rails: создать или обновить с сохранением модели

Поэтому я установил фильтр before_create. Проблема с вызванной функцией заключается в том, что если я выполняю update_attributes на извлеченном объекте из него и затем возвращаю false (чтобы прервать сохранение), обновление не выполняется (по какой-то причине я не знаю).

update_attributes возвращает истину, и нет никаких ошибок, но в журнале я вижу только

SQL (0.2ms) 

Если я не вернусь ложно, запись корректно обновляется, но и вставляет новую запись (и Я не хочу этого). Любая помощь?

+0

Возвращение ложного в AR обратного вызова будет, дизайн, прервать всю сделку. Это то, что здесь происходит? – jmcnevin

+0

да, думаю. любой способ работать над этим? – pistacchio

+0

будет ли наблюдатель более подходящим для этой ситуации? –

ответ

0

При использовании обратных вызовов любой вызов update_attribute из-за обратного вызова before_create будет его поддерживать.

Я был укушен неожиданно этим. Я думаю, что источник для этого исходил от rails api, в одном лайнере или в блоге, который ускользает от меня прямо сейчас, извините.

Этот сложный вызов не является подтверждением?

Возможно, вы можете вытащить атрибут update_attribute и использовать его после сложной логики?

+0

привет. ho, вызов не является валидацией. если бы я мог выполнить обновление из проверки, это, не будет ли оно все равно арестовано? – pistacchio

1

Отменяя обратные вызовы

Если before_ * обратный вызов возвращает ложь, все последующие обратные вызовы и связанные с ними действия отменяются. Если обратный вызов after_ * возвращает false, все последующие обратные вызовы будут отменены. Обратные вызовы обычно выполняются в том порядке, в котором они определены, за исключением обратных вызовов, определенных как методы модели, которые называются последними.

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

привет, спасибо за разъяснение. вы говорите, что я не могу решить свою проблему таким образом? – pistacchio

+0

Было бы полезно разместить ваш код before_create, чтобы мы могли видеть, что вы делаете. –

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