2012-05-10 21 views
2

我有兩個頂級數組,它們具有相同的格式。我想將它們合併:Jbuilder:我如何合併2個頂級數組?

json = Jbuilder.encode do |json| 
    json.(companies) do |json, c| 
    json.value c.to_s 
    json.href employee_company_path(c) 
    end 
    json.(company_people) do |json, cp| 
    json.value "#{cp.to_s} (#{cp.company.to_s})" 
    json.href employee_company_path(cp.company) 
    end 
end 

所以輸出將如下所示:"[{value: "a", href: "/sample1"}, {value: "b", href: "/sample2"}]"

但上面的代碼不起作用。它只包括第二個陣列:"[{value: "b", href: "/sample2"}]"

有人可以幫助我嗎?提前致謝。

回答

1
result = [] 
companies.each do |c| 
    result << {:value => c.to_s, :href => employee_company_path(c) 
end 
company_people.each do |c| 
    result << {:value => "#{cp.to_s} (#{cp.company.to_s})", :href => employee_company_path(cp.company) 
end 
# at this point result will be an array of companies and people which just needs converting to json. 
result.to_json 
+0

我在找更多的「Jbuilder like solution」,但這也不錯。謝謝! – melekes

4

我知道有兩種選擇:

def Employee 
    def company_path 
    self.company.company_path if self.company 
    end 
end 

[...] 

combined = (companies + company_people).sort_by{ |c| c.value } 
# Do other things with combined 

json.array!(combined) do |duck| 
    json.value(duck.to_s) 
    json.href(duck.company_path) 
end 
  • 或者當你有:

    1. 迭代,這與鴨的多源陣列行之有效前合併陣列鴨子和火雞,結合json陣列:

      company_json = json.array!(companies) do |company| 
          json.value(company.to_s) 
          json.href(employee_company_path(company)) 
      end 
      
      people_json = json.array!(company_people) do |person| 
          json.value(person.to_s) 
          json.href(employee_company_path(person.company)) 
      end 
      
      company_json + people_json 
      

    在這兩種情況下,都不需要調用#to_json或類似的函數。

  • +0

    我該如何組合並按值排序這些數組,然後向它們添加一個鍵? –

    +0

    @PeterR在第一個例子中,兩個數組正在組合。要進一步操作它們,而不會使代碼難以讀取 - 從#array中取出組合!打電話,做你喜歡的事情。我擴展了這個例子來展示一種可能的解決方法。 –

    0

    尤里的回答讓我親近,但對我來說最終的解決方案只是在我的.jbuilder文件中做這個。

    json.array!(companies) do |company| 
        json.value(company.to_s) 
        json.href(employee_company_path(company)) 
    end 
    
    json.array!(company_people) do |person| 
        json.value(person.to_s) 
        json.href(employee_company_path(person.company)) 
    end 
    

    我把數組放入的順序是數組合成的順序。