Ответ 1
Вы хотите attr_readonly
.
Моя модель счета имеет атрибут address_id, и я не хочу, чтобы этот адрес_ид менялся FOREVER. Поэтому я не хочу, чтобы это происходило вне класса:
invoice.address_id = 1
invoice.address = some_address
Rails автоматически добавляет этот атрибут address_id к модели из таблицы счетов, поэтому как я могу объявить этот атрибут private/protected? Вызов
attr_protected :address_id
скорее всего, не является решением, поскольку на основе документации он только предотвращает массовые назначения.
Спасибо!
Вы хотите attr_readonly
.
Не так красиво, как один лайнер, но код ниже должен работать (и вы всегда можете выполнить метапрограммирование, чтобы написать "неизменный" метод)
def address_id=(id)
if new_record?
write_attribute(:address_id, id)
else
raise 'address is immutable!'
end
end