Использование jBuilder для построения сложного массива - PullRequest
0 голосов
/ 05 апреля 2020

Я использую jBuilder и jsTree (https://www.jstree.com/docs/json/) в своем приложении Rails и пытаюсь построить массив следующим образом:

[
{
  id          : "string" // required
  parent      : "string" // required
  text        : "string" // node text
  icon        : "string" // string for custom
  state       : {
    opened    : boolean  // is the node open
    disabled  : boolean  // is the node disabled
    selected  : boolean  // is the node selected
  },
  li_attr     : {}  // attributes for the generated LI node
  a_attr      : {}  // attributes for the generated A node
},
{...},
{...}
]

Я делал это раньше с помощью простого json.array! и do l oop с набором результатов из моей базы данных. Там нет проблем. Проблема в том, что у меня полиморф c родителей, т.е. есть разные модели. Я приравняю это к примеру, где у меня есть «Продукты» и «Оборудование», и все они имеют комментарии, вложенные ниже. Я хочу перечислить все проекты (с дочерними комментариями), затем перечислить все оборудование и затем дочерние комментарии для них. По сути, мне нужен al oop, например:

[

projects do |p|
  json.id id
  json.parent "#"
  ...
end

equipment do |e|
  json.id id
  json.parent "#"
  ...
end

comments do |c|
  json.id id
  json.parent c.parent_id
  ...
end

]

Таким образом, я могу построить ха sh данных для анализа jsTree. Документы для jBuilder не очень хороши, и я не уверен, как или как я могу это сделать.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Получилось так просто:

json.array!
json.(@projects) do |p|
  json.id id
  json.parent "#"
  ...
end
json.(@equipment) do |e|
  json.id id
  json.parent "#"
  ...
end
json.(@comments) do |c|
  json.id id
  json.parent c.parent_id
  ...
end
0 голосов
/ 05 апреля 2020

Я бы просто пропустил jBuilder. Это очень медленно, и вам действительно нужен супер неловкий DSL для создания JSON объектов? После того, как все хэши и массивы Rubys четко отображаются на JSON типов.

class JsTreeSerializer
  # @param [Array] records
  # @param [Mixed] context - used to call view helpers
  def initialize(records, context: nil)
    @records = records
    @context = context
  end

  def serialize
    json = @records.map do |record|
      { 
         id: record.id,
         parent: record.parent_id,
         icon: context.image_url('icon.gif')
         # ...
      }
    end
  end
end

Использование:

class MyController 
  def index
     @records = get_all_the_types
     respond_to do |f|
       format.json do
         render json: JsTreeSerializer.new(
           @records, 
           context: view_context
         ).serialize
       end
     end
  end
end
...