使用Rails 5

时间:2018-08-31 21:55:55

标签: ruby-on-rails ruby serialization model include

我有这段代码可以通过自定义序列化器呈现可变的空缺,并且还包含了一家餐厅,作为我的模型的一部分。

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不是表格,是我的空缺模型中的方法

P.D.2。的确,如果我在序列化程序中将total_vacancies作为属性可以工作,但是如果我每次渲染此json都可以,那么每次调用空缺时,它都会重复total_vacancies我有100个空缺,那么我的json会将我的空缺和total_vacancies的所有参数写成100次,而不是作为一个不同的对象

2 个答案:

答案 0 :(得分:1)

我认为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

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

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

答案 1 :(得分: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