【问题标题】:Jbuilder: How I can merge 2 top level arrays?Jbuilder:如何合并 2 个顶级数组?
【发布时间】:2012-05-18 19:30:17
【问题描述】:

我有两个顶级数组,它们的格式相同。我想合并它们:

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"}]"

有人可以帮我吗?提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 json jbuilder


    【解决方案1】:

    Yuri 的回答让我很接近,但对我来说最终的解决方案就是在我的 .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
    

    我放入数组的顺序是数组组合的顺序。

    【讨论】:

      【解决方案2】:

      我知道两种选择:

      1. 在迭代之前组合数组,这对鸭子的多个源数组很有效:

        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
        
      2. 或者当你有鸭子和火鸡时,组合 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 或类似的方法。

      【讨论】:

      • 如何按值组合和排序这些数组,并为它们添加键?
      • @PeterR 在第一个示例中,两个数组被合并。为了进一步对它们进行操作——而不使代码难以阅读——将组合从#array 中拉出来!打电话,做你喜欢的事。我扩展了示例以展示一种可行的方法。
      【解决方案3】:
      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
      

      【讨论】:

      • 我一直在寻找更多“类似 Jbuilder 的解决方案”,但这也很好。谢谢!
      猜你喜欢
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      相关资源
      最近更新 更多