使用JSONB和Mobility的自定义Writer和访问器

时间:2018-02-16 01:58:54

标签: ruby-on-rails ruby mobility

移动版本:0.4.2 / Rails版本:5.2.0.rc1

在使用Mobility的Rails应用程序中,我有一个如下所示的模型结构:

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 个答案:

答案 0 :(得分:0)

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,并将默认值设置为{}以避免出现空键错误。

让脏跟踪工作我作为练习留给读者;)