Как защитить атрибут модели Rails? - PullRequest
12 голосов
/ 26 сентября 2008

Моя модель Invoice имеет атрибут address_id, и я не хочу, чтобы этот address_id менял FOREVER. Поэтому я не хочу, чтобы это происходило вне класса:

invoice.address_id = 1
invoice.address = some_address

Rails автоматически добавляет этот атрибут address_id в модель из таблицы счетов, так как я могу объявить этот атрибут закрытым / защищенным? Вызов

attr_protected :address_id

, скорее всего, не является решением, поскольку, основываясь на документации, оно предотвращает только массовые назначения.

Спасибо!

Ответы [ 2 ]

20 голосов
/ 26 сентября 2008

Вы хотите attr_readonly.

3 голосов
/ 26 сентября 2008

Не так красиво, как в одной строке, но приведенный ниже код должен работать (и вы всегда можете выполнить метапрограммирование, чтобы написать «неизменный» метод)

def address_id=(id)
  if new_record?
    write_attribute(:address_id, id)
  else
    raise 'address is immutable!'
  end
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...