Сделать несколько включает в JSON с рельсов 5 - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть этот код, который создает переменную вакансию с настраиваемым сериализатором, а также входит в состав ресторана как часть моей модели.

vacancy = Vacancy.find(params[:id])
render json: vacancy, 
       serializer: VacancyDetailSerializer,
       include: [:restaurant]

Дело в том, что я хочу включить несколько объектов и выполнить рендеринг, примерно так:

vacancy = Vacancy.find(params[:id])
render json: vacancy, 
       serializer: VacancyDetailSerializer,
       include: [:restaurant, :total_vacancies]

В :total_vacancies Я хочу отправить Vacancy.count, но я не знаю, должен ли я сделать это с помощью сериализаторов, или во включении, или как это сделать.

Как я знаю, мне просто нужно поставить запятую после объекта, а затем указать другой объект во включенном, но не работает.

Обновление

P.D. total_vacancies - это не таблица, это метод из моей модели Vacancy

P.D.2. Это правда, что если я добавлю total_vacancies в качестве атрибута в моем сериализаторе, он будет работать, но если я буду делать это каждый раз, когда я рендую этот json, он будет повторять total_vacancies каждый раз, когда я вызываю вакансию, например, представьте, что у меня есть 100 вакансии, тогда мой json запишет все параметры, которые у меня есть из моей вакансии и total_vacancies 100 раз вместо 1 раза как другой объект

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Решение, данное Яном Льюисом на Facebook:

Просто введите

render json: { vacancy: vacancy, vacancy_count: Vacancy.count }

И тогда все работает отлично, окончательный код был таким:

render json: { vacancy: vacancy, vacancy_count: Vacancy.count },
             each_serializer: VacancyDetailSerializer,
             include: [:restaurant]

Источник:

https://www.facebook.com/groups/railsrocks/permalink/10151113078349957/?comment_id=10151113264214957&reply_comment_id=10151113313639957&notif_id=1535830677954887&notif_t=group_comment

0 голосов
/ 01 сентября 2018

Я предполагаю, что TotalVacancies - это еще одна таблица.

Вам необходимо иметь отдельный сериализатор для каждого, и VacancyDetailSerializer необходимо изменить, как показано ниже

, если TotalVacancies не является отдельной таблицей. Если TotalVacancies не является отдельной таблицей, используйте has_many, который я прокомментировал ниже, и используйте соответствующий ему сериализатор: TotalVacanciesSerializer

class VacancyDetailSerializer < ActiveModel::Serializer

  attributes :total_vacancies

  #has_many :total_vacancies
  has_one :restaurant     

  def total_vacancies
   self.object.count
  end
end


# total_vacancies_serializer.rb
class TotalVacanciesSerializer < ActiveModel::Serializer

end

# restaurant_serializer.rb
class RestaurantSerializer < ActiveModel::Serializer

end

Вам не нужно включать это в рендер. Поскольку мы добавили в VacanciesSerializer ниже код сам по себе должен включать в себя TotalVacancies и Ресторан

Также вы можете контролировать список атрибутов в Restaurant и TotalVacancies

vacancy = Vacancy.find(params[:id])
render json: vacancy, 
       serializer: VacancyDetailSerializer
...