Заявление об ограничении ответственности: я сам не использовал Spina и не знаю его проекта.
Это не столько вопрос Rails, сколько о геме и о том, как его авторы предполагали его настраивать.
При просмотре кода драгоценного камня здесь (строки 16-29) выясняется, что serialized_attr_accessor
- это метод класса Spina::Account
, который перебирает каждый предоставленный аргумент и добавляет методы получения и установки. динамически.
В общем, вы правы, что в Rails вы можете добавить файл app/models/spina/account.rb
и повторно открыть класс. Однако это не отменяет определение класса в других файлах. Следовательно, исходный вызов serialized_attr_accessor
по-прежнему вызывается - вы не можете игнорировать его в данном конкретном случае.
Пока вы хотите добавить атрибуты, а не удалять их, вы можете выполнить следующий код, и он должен иметь желаемое поведение. Вы можете поместить этот код в инициализатор (например, под config/initializers/spina.rb
- все файлы под config/initializers
запускаются в алфавитном порядке как часть процесса загрузки Rails):
Spina::Account.serialized_attr_accessor :twitch, :github
Однако, хотя это исправление может работать для вас сегодня, если авторы Spina не указали, что эта расширяемость поддерживается как часть интерфейса гема, то вы рискуете, что завтра (точнее - в следующем выпуске Spina) он может сломаться. Вполне возможно, что авторы никогда не предполагали, что serialized_attr_accessor
будет опубликован c, и могут переименовать / удалить / изменить его поведение в следующей версии, что нарушит ваше приложение.
Вообще говоря, открытие классов ( называется «обезьяна исправления») и вызов не-publi c методов (или непредусмотренных интерфейсов) - это практика, которую следует использовать с осторожностью, даже если это можно сделать в Ruby, поскольку вы связываете свой код с реализацией драгоценного камня .
Еще одна вещь, на которую следует обратить внимание для этого «исправления». Эти два добавленных вами атрибута не сохраняются в базе данных. Они хранятся только в памяти. Я не уверен, сохранились ли какие-либо другие поля, поскольку я не знаком с драгоценным камнем. Но если вам нужно, чтобы они были постоянными, вам нужно будет добавить миграцию в Rails. Вы можете создать миграцию для изменения таблицы spina_accounts
, но это звучит как плохая идея, поскольку она сильно связывает ваше приложение с их реализацией. Вы также можете создать свою собственную таблицу accounts
, которая расширяет учетную запись Spina, ссылаясь на запись учетной записи (например, spina_account_id
) и добавляя необходимые вам дополнительные поля.
В любом случае, я предлагаю открыть на странице github гемма и спросите, поддерживают ли они официально возможность настройки атрибутов учетной записи.