我有一个rails 2应用程序来管理表中的json字段。它需要:
目前,我有一个库文件,手动添加提取和保存到json的方法,如下所示:
module Configuration
def configuration_json
configuration? ? JSON.parse(self.configuration) : {}
end
def some_json_value
if !self.configuration.nil? && configuration_json["parentKey"]
configuration_json["parentKey"]["someJsonValue"]
end
end
def some_json_value=(val)
new_config = configuration_json.deep_merge({
"FeatureConfiguration" => { "someJsonValue" => val }
})
self.configuration = new_config.to_json
end
def some_json_value_validation
# ...
end
end
在模型中我包含了这个
class SomeModel < ActiveRecord::Base
include Configuration
validate :some_json_value_validation
# ...
end
有更好/更干的方式吗?目前,当json结构发生变化时,它真的很笨重,因为在rails应用程序中有很多步骤需要修改。
我无法更改json字段的使用,因为它是用于配置另一个应用程序,这是rails应用程序支持的主要应用程序。
答案 0 :(得分:1)
最好的方法是创建一个Configuration模型,然后简单地创建一个构建正确json对象的to_json
方法。
如果你真的想要解析json并在每次操作时将其转换回来,你可以帮助为你创建方法,比如json_attr_accessor
示例:
module Configuration
def configuration_json
configuration.present? ? JSON.parse(configuration) : {}
end
module ModelExtensions
def json_attr_accessor(*symbols)
symbols.each do |sym|
key = sym.to_s.camelize(:lower)
define_method(sym) do
['FC', key].reduce(configuration_json) do |json, key|
json and json[key]
end
end
define_method("#{sym}=") do |val|
hash = configuration_json.deep_merge 'FC' => { key => val }
self.configuration = hash.to_json
end
end
end
end
def self.included(base)
base.extend ModelExtensions
end
end
在模型中:
class SomeModel < ActiveRecord::Base
include Configuration
json_attr_accessor :some_json_value
end
以下是帮助自定义验证程序的链接:
http://www.perfectline.ee/blog/building-ruby-on-rails-3-custom-validators