Custom Writer и Accessors, использующие JSONB с Mobility
Версия мобильности: 0.4.2 / Версия Rails: 5.2.0.rc1
В приложении Rails, использующем Mobility, у меня есть структура модели, которая выглядит следующим образом:
create_table :settings do |t|
t.string :type
t.jsonb :values, null: false, default: {}
t.timestamps
end
add_index :site_settings, :values, using: :gin
И моя модель выглядит так:
class Setting < ApplicationRecord
extend Mobility
translates :values
end
В столбце значений я сохраняю настройки нескольких значений, например:
Setting.create(values: { setting_1: 'test', setting_2: 'test2' })
До этого момента Mobility работает как положено и сохраняет хеш в нужном месте.
Но теперь я хотел бы предоставить другим разработчикам удобные методы для записи и чтения значений, например:
ss = Setting.new
ss.setting_1 = 'test'
ss.setting_2 = 'test2'
ss.save
и читать методы:
Setting.last.setting_1 => 'test'
Я пытался использовать store_accessor
и даже с пользовательскими средствами доступа, но я не могу работать должным образом Мобильность с помощью store_accessor
или другие пользовательские методы.
Любая помощь?
Конфигурация мобильности:
Mobility.configure do |config|
config.default_backend = :jsonb
config.accessor_method = :translates
config.query_method = :i18n
end
1 ответ
class Setting < ApplicationRecord
extend Mobility
translates :values, presence: false, default: {}
def setting_1
values["setting_1"]
end
def setting_1=(value)
values["setting_1"] = value
end
def setting_2
values["setting_2"]
end
def setting_2=(value)
values["setting_2"] = value
end
# etc...
end
Я отключил плагин присутствия, который в противном случае превратил бы пустой хеш в nil
и установите значение по умолчанию {}
чтобы избежать ошибки с нулевым ключом.
Грязное отслеживание работы я оставляю читателю в качестве упражнения;)