我有一个模型/表,其中有一个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

关于ruby-on-rails - 在Rails中获取和设置json列键的巧妙方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54587936/

10-14 04:18