2010-05-08 6 views
0

У меня есть модель с обратным вызовом, который работает after_update:рельсы, ActiveRecord обратные вызовы не экономить

after_update :set_state 

protected 

def set_state 
    if self.valid? 
    self.state = 'complete' 
    else 
    self.state = 'in_progress' 
    end 
end 

Но это не на самом деле сохранить эти ценности, то почему нет? Независимо от того, действительна ли модель или нет, она даже не напишет ничего, даже если я удалю условие if self.valid?, я не могу сохранить состояние.

Ум, это может показаться глупым, мне нужно запустить save на нем?


обновление

На самом деле, я не могу запустить save там, потому что это приводит к бесконечному циклу. [вздохи]

+0

Использовать 'update_attribute'. – klew

ответ

1

after_update номер после обновление, поэтому после сохранения. Вы можете использовать update_attribute, чтобы сохранить это значение, или просто позвоните save (я не уверен, нет ли какой-либо отступности). В конечном итоге вы можете назначить его в before_update (список доступных вариантов: here). С другой стороны, недействительный объект не будет сохранен в любом случае, так почему вы хотите назначить здесь state?

1

Судя по тому, что примеры в ActiveRecord документации делать такие вещи, как это:

def before_save(record) 
    record.credit_card_number = encrypt(record.credit_card_number) 
end 

def after_save(record) 
    record.credit_card_number = decrypt(record.credit_card_number) 
end 

вам нужно сохранить запись самостоятельно.

1

after_update работает над объектом в памяти, а не на записи в таблице. Чтобы обновить атрибуты в БД, выполните следующие действия:

after_update :set_state 

protected 

def set_state 
    if self.valid? 
    self.update_attribute('state', 'complete') 
    else 
    self.update_attribute('state', 'in_progress') 
    end 
end 
Смежные вопросы