Игнорировать столбец «только для чтения» при создании и обновлении в Ruby ActiveRecord

Я ищу решение следующей проблемы: у меня есть объект ActiveRecord, который поддерживается обновляемым представлением базы данных (в DB2 через гем activerecord-jdbc-adapter). Это представление содержит один столбец, который рассчитывается на основе других столбцов и доступен только для чтения: вы не можете установить этот столбец каким-либо допустимым способом. Когда для этого объекта создается новая запись, это поле не должно устанавливаться , а не . Однако по умолчанию ActiveRecord устанавливает для него значение «по умолчанию» (NULL), которое отклоняется базой данных.

attr_readonly не является решением, потому что это исключает только столбец из обновлений, а не из создает.

attr_ignore, например, реализованный гемом lincoln, тоже не является решением, потому что тогда поле полностью игнорируется. Однако столбец по-прежнему должен быть доступен для чтения. На самом деле он даже используется как часть отношения.

Существуют способы запретить вам устанавливать определенный атрибут объекта ActiveRecord, но это обычно не препятствует включению этого атрибута в операторы создания или обновления

кто-нибудь знает, есть ли способ в 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 правильным.

5
задан Confusion 14 July 2011 в 19:07
поделиться