Сериализатор ActiveModel с has_and_belongs_to_many

У меня есть модель под названием Event. Событие has_and_belongs_to_many :event_sub_categories и подкатегория EventSubCategory has_and_belongs_to_many :events. У меня есть следующее действие:

def index
    @events = Event.where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json
    render json: @events
end

Действие возвращает данные именно так, как нужно, за исключением одной проблемы: у него нет подкатегорий. Мне нужно, чтобы json содержал подкатегории. Я попытался сделать следующий сериализатор ActiveModel:

 class EventSerializer < ActiveModel::Serializer
   attributes :id, :name, :event_sub_categories
 end

но приведенный выше сериализатор вообще не меняет json. Как я могу это исправить?


person Philip7899    schedule 20.04.2016    source источник
comment
Что такое subcategories и как они связаны с events?   -  person Uzbekjon    schedule 20.04.2016
comment
Я обновил вопрос. Извините, я напортачил, когда написал это, и набрался терпения, когда имел в виду event_sub_category. Теперь вопрос должен быть более ясным.   -  person Philip7899    schedule 20.04.2016


Ответы (2)


пытаться

class EventSerializer < ActiveModel::Serializer
  attributes :id, :name 
  has_many :event_sub_categories
end
person Zhiliang Xing    schedule 20.04.2016
comment
я думаю, вы должны удалить to_json в @events = Event.where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json, потому что сериализатор activemodelserializer автоматически обрабатывает его за вас - person Zhiliang Xing; 21.04.2016
comment
вы используете полные рельсы или API рельсов? - person Zhiliang Xing; 21.04.2016
comment
Этот ответ правильный, наряду с удалением .to_a.to_json в конце первой строки вашего метода. AMS не сработает, если вы вызовете to_json на своих моделях. - person beauby; 21.04.2016
comment
Мне нужно это в массиве. Angular на стороне клиента нужен массив. Кроме того, удаление .to_a.to_json все равно не исправит :( - person Philip7899; 22.04.2016
comment
Это делает group_by, но мне НУЖНО, чтобы информация была сгруппирована таким образом. - person Philip7899; 22.04.2016
comment
Что бы вы ни делали, вызов to_json для ресурса приведет к тому, что код AMS не будет вызываться. Ваш звонок. - person beauby; 24.04.2016

Попробуй это:

1- В вашем контроллере измените запрос таким образом, чтобы он включал event_sub_categories:

def index
    @events = Event.includes(:event_sub_categories).where(begins_at: DateTime.now.beginning_of_day..1.week.from_now).group_by{|e| e.begins_at.beginning_of_day}.to_a.to_json
    render json: @events
end

2- создайте сериализатор для модели EventSubCategory

3- в сериализаторе событий создайте метод event_sub_categories

class EventSerializer < ActiveModel::Serializer
   attributes :id, :name, :event_sub_categories

   def event_sub_categories
     object.event_sub_categories.map do |sub_category|
       EventSubCategorySerializer.new(sub_category)
     end
   end
 end
person kellsaro    schedule 29.06.2019