我有一个模型/表,其中包含一个JSON列,如下所示
t.json :options, default: {}
字符串
列中可以包含许多键,类似于
options = {"details" : {key1: "Value1", key2: "Value2"}}
型
我想轻松地设置和获取这些值。所以我做了getter和setter。
def key1
options['details']&.[]('key1')
end
def key1=(value)
options['details'] ||= {}
options['details']['key1'] ||=0
options['details']['key1'] += value
end
型
但这只是增加了代码行,当添加更多细节时,它不会扩展。你能建议一个干净整洁的方法吗?
4条答案
按热度按时间rryofs0p1#
使用动态方法创建:
字符串
nlejzf6q2#
你也可以把键作为参数传递,对吗?
字符串
ngynwnxp3#
简单短小
根据可重用性,你可以选择不同的选项。简单的选项是使用循环和
#define_method
来定义方法。字符串
编写模块
或者,你可以编写一个模块,提供上述作为帮助程序。一个简单的模块可能看起来像这样:
型
现在你可以简单地用这些helper扩展你的类,并轻松地添加reader/writer。
型
如果有任何不清楚的地方,请在评论中询问。
ozxc1zmp4#
这被引用为一个Phind调用的链接,给了我一个糟糕的答案。我建议
store_accessor :column_name
是2024年与平面JSON对象接口的最佳方式。它允许您与JSON列交互,就像它是一个关联一样,例如,
字符串
然后,您可以通过
profile.website_url
调用示例,并使用profile.website_url = "https://blah.com
进行设置