我正在使用Rails 4并从不同来源获得以下JSON输出
source1中
@something1 = book.find().to_json
输出
"[{\"a\": \"val1\"}]"
源2
@something2 = Author.where(title: :autitle).pluck(:val2).to_json
输出
"[{\"b\": \"val2\"}]"
来源3
@something3 = Publications.find_by_pub_id(id)
输出
{
"c":"val3",
"d":" val4"
}
我希望最终输出像
{
"a": "val1",
"b": "val2",
"c":"val3",
"d":" val4"
}
我使用了像
这样的合并@newval= @something1[0].merge(@something2[0]).merge(@something3)
但是,它给出了错误
未定义的方法合并!
这些变量在索引方法中,如
class Test controller < api::controller
def index
@something1 = ..
@something2 = ..
@something3 = ..
end
end
希望很清楚。
答案 0 :(得分:2)
没有更多信息,这似乎已经足够了
@something1[0].merge(@something2[0]).merge(@something3)
{
:a => "val1",
:b => "val2",
:c => "val3",
:d => " val4"
}
答案 1 :(得分:1)
您可以创建如下函数:
def mergejson(*args)
merged = {}
args.each do |a|
merged.merge!(a.is_a?(Hash) ? a : a.first)
# or use .deep_merge! if the hashes can contain nested hashes
end
return merged
end
irb(main):025:0> test = mergejson(something1, something2, something3)
=> {:a=>"val1", :b=>"val2", :c=>"val3", :d=>"val4"}
答案 2 :(得分:1)
这里的问题是JSON是String
因此
@something1 = book.find().to_json
#=> "[{\"a\": \"val1\"}]"
这将使得在尝试&#34;合并时更难以处理。他们在一起。
您收到的错误是因为String
没有merge
方法(下次请发布完整错误或至少是对象引用),例如undefined method merge! for "[{\"a\":\"val1\"}]":String
幸运的是,修复非常简单,只需从原来的2次调用中删除to_json
require 'json'
@something1 = [{"a": "val1"}] # no to_json
@something2 = [{"b": "val2"}] # no to_json
@something3 = { "c": "val3", "d": " val4" } # no to_json
@something1[0].merge(@something2[0]).merge(@something3).to_json
#=> "{\"a\":\"val1\",\"b\":\"val2\",\"c\":\"val3\",\"d\":\" val4\"}"
请参阅Example(基于@ Gerry的原始评论示例)
如果我们理解Book
,Author
和Publication
之间的关系,例如,我们可能会简化整个过程。
Book.find().to_json(include: [:author,:publications])
# Or
Book.find().to_json(include: [{author: {only: :name}},:publications])
这将避免合并的需要,因为我担心原始示例实际上可能需要
@something1 = book.find()
@something2 = book.author
@something3 = book.publications
@something1.attributes.merge({author: @something2.attributes,
publications: @something3.map(&:attributes)}).to_json
答案 3 :(得分:0)
还有以下工作:
@something1.first.merge(@something2.first).merge(@something3)
#=>{:a => "val1",:b => "val2",:c => "val3",:d => " val4"}