2015-11-12 2 views
1

У меня есть модель Categoryhas_ancestry и активная модель сериализаторов

class Category < ActiveRecord::Base 
    attributes :id, :name, :order, :x, :y, :z 
    has_ancestry 
end 

В мой контроллер, я могу использовать следующее, чтобы получить целое дерево, как JSON

Category.first.subtree.arrange_serializable 

Но это возвращает все DB такие атрибуты как created_at или id

Я хотел использовать активный сериализатор модели для формирования моего вывода без потери древовидной структуры.

class CategorySerializer < ActiveModel::Serializer 
    # Children is the subtree provided by ancestry 
    attributes :name, :x, :children 
end 

Контроллер

class CategoryController < ActionController::Base 
    def index 
    category = Category.first 
    render :json => category 
    end 
end 

Код выше будет отображаться только первый уровень суб, но не дети детей. Любой помощь приветствуется

ответ

1

Чтобы использовать устройство, необходимо передать дополнительный параметр сериализатору, вы можете сделать это следующим образом:

category.subtree.arrange_serializable do |parent, children| 
    CategorySerializer.new(parent, scope: { children: children }) 
end 

А вот как вы можете принять этот параметр в сериализаторе:

class CategorySerializer < ActiveModel::Serializer 
    attributes :id, :name, :order, :children 

    def children 
    scope.to_h[:children] 
    end 
end 

Также вы можете взглянуть на this test, чтобы лучше понять, как работает arrange_serializable.

+0

Это не работает. Он сериализует корневой элемент, а затем объединяет все подуровни в одном списке и выводит их, не обращая внимания на сериализатор – pabera

+0

, пожалуйста, покажите, как вы используете этот код (возможно, у контроллера). –

+0

Спасибо, я также нашел этот фрагмент в документах. Но как использовать этот сериализатор. Я попробовал, и это применит только к первому элементу, а не к нисходящим onces. – pabera

0

В AMS 10.x (мастер филиал) мы можем поддерживать внешние параметры таким образом:

class CategorySerializer < ActiveModel::Serializer 
    attributes :id, :name, :order, :children 

    def children 
    instance_options[:children] 
    # or instance_options[:children]&.as_json 
    end 
end 

Далее вы можете просто передать детям сериализатором:

category.subtree.arrange_serializable do |parent, children| 
    CategorySerializer.new(parent, children: children) 
end 

или

category.subtree.arrange_serializable do |parent, children| 
    ActiveModelSerializers::SerializableResource(parent, children: children) 
end 

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

  • Нет связанных вопросов^_^