2017-04-24 42 views
1

我的应用程序传递给不同的方法一个json_element,其中的密钥是不同的,有时是空的。使用红宝石提取散列值以干的方式

来处理它,我一直在硬编码的提取与下面的示例代码:

def act_on_ruby_tag(json_element) 

begin 

    # logger.progname  = __method__ 
    logger.debug    json_element 

    code     = json_element['CODE']['$'] unless json_element['CODE'].nil? 
    predicate    = json_element['PREDICATE']['$'] unless json_element['PREDICATE'].nil? 
    replace    = json_element['REPLACE-KEY']['$'] unless json_element['REPLACE-KEY'].nil? 
    hash     = json_element['HASH']['$'] unless json_element['HASH'].nil? 

我想消除硬编码值,并不太清楚如何。

我开始想通过它,如下所示:

keys = json_element.keys 
keys.each do |k| 
     set_key = k.downcase 
     instance_variable_set("@" + set_key, json_element[k]['$']) unless json_element[k].nil? 
     end 

然后在方法的其余部分使用@code例如。

我打算尝试变成一种方法,然后替换所有这些硬编码的代码。

但我不完全确定这是否是一条好路径。

回答

3

从一个方法中返回散列结构几乎总是比较好,因为你有像{ code: ... }这样的东西,而不是设置任意实例变量。如果你将它们放在一个一致的容器中,呼叫者可以更容易地处理将它们传送到正确的位置,稍后存储它,或者挑选出他们想要的并丢弃剩下的东西。

这也是一个不错的主意,试图通过一系列更小,更轻的操作来打破一个大而笨重的步骤。这使得代码更容易遵循:

def extract(json) 
    json.reject do |k, v| 
    v.nil? 
    end.map do |k, v| 
    [ k.downcase, v['$'] ] 
    end.to_h 
end 

然后你得到这样的:

extract(
    'TEST' => { '$' => 'value' }, 
    'CODE' => { '$' => 'code' }, 
    'NULL' => nil 
) 
# => {"test"=>"value", "code"=>"code"} 

如果你要坚持这整个事,作为一个实例变量,这是一个相当典型的模式,但它将有一个可预测的名称,不受任何您正在使用的任意JSON文档的支配。

一种替代方案是硬编码在一个恒定像键:

KEYS = %w[ CODE PREDICATE ... ] 

然后使用该代替,或一步,限定在一个YAML或JSON文件可以读入进行配置目的。这实际上取决于这些变化的频率以及对输入的不规则性有什么样的期望。

+0

谢谢...我意识到,“$”,实际上是用CobravsMongoose gem.BUT的artfact ...真正的问题是,你正在讨论什么....拔出钥匙,并检查如果有价值或没有错误出局。 有时其中一个键没有值 - 它是空的。这就是为什么我有'零'检查。 – Angela

+0

空和'无?'是两回事,请牢记这一点。如果你只是在寻找可以导入的东西,那么测试vs.'v'就足够了。最小代码通常更容易调试。 – tadman

0

这是一个稍微更简洁的方式来做你的原代码。

code, predicate, replace, hash = json_element.values_at *%w{ 
    CODE PREDICATE REPLACE-KEY HASH 
}.map { |x| x.fetch("$", nil) if x } 
+0

在这些情况下,我需要知道aprori键是'代码,谓词,替换...等等'吗?每次都会改变......思考是否有助于提前知道......它可能会... – Angela

+0

我该如何解析这一点 - 我可以在没有'$'工件的情况下创建它。 – Angela

+0

这是一种将4个特定键提取到顶级变量中而不使用元编程的方法。像红宝石一样,有许多方法可以做同样的事情 –