Коллекция RoR API RABL в массив

Текущий код RABL:

object @region
attributes :id, :name, :latitude, :longitude, :region_id
child :sub_regions do
  attributes :name
end

Я получаю следующий вывод:

{
    "id": 1,
    "name": "test",
    "latitude": "30.932351",
    "longitude": "92.83391",
    "region_id": 1,
    "sub_regions": [{
            "name": "1"
        }, {
            "name": "2"
        }, {
            "name": "3"
        }, {
            "name": "4"
        }, {
            "name": "5"
        }, {
            "name": "6"
        }, {
            "name": "7"
        }
    ]
}

Я хочу удалить атрибут имени и просто отобразить значения в виде массива. Но я хочу преобразовать коллекцию в массив, как здесь:

{
    id: 1,
    name: "test",
    latitude: "30.932351",
    longitude: "92.83391",
    region_id: 1,
    sub_regions: [
            "1",
            "2",
            "3",
            "4",
            "5",
            "6",
            "7"
    ]
}

Ближе всего я могу добраться до этого кода RABL:

code :sub_regions do |s|
  s["name"]
end


{
    {
          id: 1,
          name: "test",
          "latitude": "30.932351",
          "longitude": "92.83391",
          region_id: 1,
          sub_regions: "1"
    }

}

В приведенном выше блоке кода в show.json.rabl отображается только первый элемент, как мне сделать его массивом со всеми элементами?


person Community    schedule 23.05.2013    source источник


Ответы (3)


У joe nayyar была правильная идея в его ответе, но есть более чистый способ, чем использование object false.

child :sub_regions do
  attributes :name
end

становится...

node :sub_regions do |region|
  region.sub_regions.collect(&:name)
end
person dmur    schedule 03.10.2014

Это потому, что вы использовали объект @region вместо коллекции @region.

person Jessica Shu    schedule 05.06.2013
comment
Нет. У одной области объекта есть массив подобластей, но есть только одна область. - person ; 06.06.2013

Для тех, кто лениво блуждает в поисках решения, такого как я, поскольку RABL находится поверх базы кода ruby, вы можете сделать что-то вроде:

object false 
node :region, :object_root => false do 
{:id => @region.id, :name => @region.name, :latitude=> @region.latitude, :region_id =>  @region.region_id, :sub_regions=>@region.sub_regions.collect(&:name)}
end
person joe nayyar    schedule 30.08.2013