Techioz Blog

Railsでjson列のキーを取得および設定する巧妙な方法

概要

次のようにjson列を含むモデル/テーブルがあります

t.json :options, default: {}

列には、次のような多くのキーを含めることができます。

options = {"details" : {key1: "Value1", key2: "Value2"}}

これらの値を簡単に設定および取得したいと考えています。そこで私は同じゲッターとセッターを作成しました。

def key1
  options['details']&.[]('key1')
end

def key1=(value)
  options['details'] ||= {}
  options['details']['key1'] ||=0 
  options['details']['key1'] += value 
end

ただし、これはコードに行を追加するだけであり、詳細が追加されても拡張されません。これを行うクリーンできちんとした方法を提案していただけますか?

解決策

動的メソッド作成を使用します。

options['details'].default_proc = ->(_,_) {{}}
ALLOWED_KEYS = %i[key1 key2 key3]

ALLOWED_KEYS.each do |key|
  define_method key do
    options['details'][key] if options['details'].key?(key)
  end
  define_method "#{key}=" do |value|
    (options['details'][key] ||= 0) += value
  end
end