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и установите значение по умолчанию {} чтобы избежать ошибки с нулевым ключом.

Грязное отслеживание работы я оставляю читателю в качестве упражнения;)

Другие вопросы по тегам