2012-05-10 2 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 как решение», но это тоже хорошо. Спасибо! – melekes

4

Я знаю, что из двух вариантов:

  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 или тому подобное.

+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 

Порядок, в который я помещал массивы, - это порядок, в котором был объединен массив.

Смежные вопросы