5

同じ形式の 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"}]"

しかし、上記のコードは機能しません。2 番目の配列のみが含まれます。"[{value: "b", href: "/sample2"}]"

誰かが私を助けることができますか?前もって感謝します。

4

3 に答える 3

6

私は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 などを呼び出す必要はありません。

于 2015-10-29T00:08:48.210 に答える
-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
于 2012-05-10T10:04:54.873 に答える