Прежде всего, вам не нужно использовать коллекцию атрибутов, вы можете просто сделать self.client_id
. Еще лучше, если у вас есть belongs_to :client
в вашем Invoice
, вы можете просто сделать self.client.last_invoice_number
. Наконец, вы почти всегда хотите вызвать исключение в случае сбоя обновления или создания, поэтому привыкните к использованию update_attributes!
, что является лучшим выбором по умолчанию. (если у вас есть какие-либо вопросы по поводу этих вопросов, задайте их, и я подробно расскажу)
Теперь, когда это не так, вы столкнулись с проблемой с ActiveRecord, методы инициализатора почти никогда не являются правильным выбором. AR дает вам кучу методов, чтобы подключиться к любой точке жизненного цикла, в которой вы нуждаетесь. Это
after_create
after_destroy
after_save
after_update
after_validation
after_validation_on_create
after_validation_on_update
before_create
before_destroy
before_save
before_update
before_validation
before_validation_on_create
before_validation_on_update
Что вы, вероятно, хотите, это подключиться к before_create. Как то так
def before_create
self.number ||= self.client.last_invoice_number + 1 unless self.client
end
Что он будет делать, так это то, что он подключит базу данных для вашего клиента, получит последний номер счета, увеличит его на единицу и установит в качестве его нового номера, но только если вы еще не установили номер (| | = назначит, но только если левая сторона равна нулю), и только если вы установили client (или client_id) перед сохранением.