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