Я ищу решение следующей проблемы: у меня есть сущность ActiveRecord, которая поддерживается обновляемым представлением базы данных (в DB2 через гем activerecord-jdbc-adapter).Это представление содержит один столбец, который рассчитывается из других столбцов и является «только для чтения»: вы не можете установить этот столбец любым допустимым способом.Когда для этого объекта создается новая запись, это поле должно быть установлено , а не .Однако по умолчанию ActiveRecord устанавливает значение по умолчанию (NULL), которое отклоняется базой данных.
attr_readonly не является решением, поскольку исключает только столбец из обновлений, а не из созданий..
attr_ignore, например, реализованный гемом 'lincoln', также не является решением, поскольку тогда поле полностью игнорируется.Тем не менее, столбец все еще должен быть прочитан и быть доступным.На самом деле он даже используется как часть отношения.
Существуют способы запретить вам устанавливать определенный атрибут сущности ActiveRecord, но это обычно не препятствует включению этого атрибута в операторы create или update
Кто-нибудь знает, есть ли способ в ActiveRecord указать столбец как «никогда не устанавливать это поле»?
Обновление в ответ на Arsen7: я пытался использовать хук after_initialize дляудалите атрибут из вновь созданной сущности, чтобы он не был включен в составленный SQL.Проблема в том, что атрибут полностью удален и больше не доступен, в значительной степени идентичен описанной выше ситуации 'igonre_attr'.Из-за кэширования обойти это не тривиально и потребуется дополнительная логика для принудительной перезагрузки сущностей этих конкретных таблиц.Этого, вероятно, можно достичь, переопределив create
для добавления «перезагрузки», в дополнение к использованию after_initialize.
(Как указал Arsen7, я забыл упомянуть, что я на ActiveRecord 3.0.9)
Мое решение
Поскольку мои сущности уже наследуются от подкласса ActiveRecord::Base
, я решил добавить before_create
и after_create
хуки.В хуке before_create
я удаляю «вычисленные» столбцы из @attributes
экземпляра.В хуке after_create
я снова добавляю их и считываю значения «вычисленных» столбцов из базы данных, чтобы установить их на значения, которые они получили.
Добавление таких хуков почти идентично переопределению create, поэтому я считаю ответ Arsen7 правильным.