【问题标题】:Render multiple includes in json with rails 5使用rails 5在json中渲染多个包含
【发布时间】:2019-02-06 22:21:38
【问题描述】:

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

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 次作为不同的对象

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      我假设 TotalVacancys 是另一个表。

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

      如果 TotalVacancys 不是单独的表。如果 TotalVacancys 不是单独的表,则使用我在下面评论的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
      

      您不需要在渲染中包含这样的内容。由于我们在 VacancySerializer 中添加了下面的代码,因此它本身应该包括 TotalVacancys 和 Restaurant

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

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

      【讨论】:

      • 好吧,我试过这样,但我没有提到的一点是我不想多次发送total_vacancies,因为如果我将方法放入序列化程序中工作,但假设我有 100 个空缺,那么 total_vacancies 将作为属性重复 100 次,我只希望它是 1 次,这就是为什么我希望它包含另一个对象或类似的东西.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多