使用rails 5在json中渲染多个包含

问题描述 投票:1回答:2

我有这个代码,使用自定义序列化器呈现可变空位,并且还包括一个餐厅作为我的模型的一部分。

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,但我不知道我是否必须通过序列化器,或包含,或如何做它。

据我所知,我只需要在对象后面加一个逗号,然后在include中指定另一个对象但是不起作用。

更新

P.D. total_vacancies不是表格,是我的空缺模型的一种方法

P.D.2。确实,如果我把total_vacancies作为我的序列化程序中的一个属性就可以了,但是如果我每次都这样做,我会渲染这个json,每当我调用空位时它会重复total_vacancies,例如,想象我有100个空位,然后我的json将我空位和total_vacancies的所有参数写入100次而不是1次作为不同的对象

ruby-on-rails ruby serialization model include
2个回答
1
投票

我假设TotalVacancies是另一个表。

你需要为每一个都有单独的序列化器,VacancyDetailSerializer必须修改如下

如果TotalVacancies不是单独的表。如果TotalVacancies不是一个单独的表,那么使用我在下面评论的has_many并使用其相应的Serializer: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

你不需要在渲染中包含这样的东西。由于我们在Vaconcies Serializer中添加了以下代码,其本身应包括Total Vacancies和Restaurant

您还可以控制Restaurant和TotalVacancies中的属性列表

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

0
投票

Ian Lewis在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

© www.soinside.com 2019 - 2024. All rights reserved.