使用 active_model_serializers 序列化模型数组 [英] Serialize an array of models using active_model_serializers

查看:17
本文介绍了使用 active_model_serializers 序列化模型数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 gem

UPDATE#1 用于索引方法

def 索引@search = Admin.search(params[:q])@admins_array = @search.result(:distinct => true).to_a如果参数[:page]@admins = @search.result(:distinct => true).page(params[:page][:number]).per(10)@admins_json_array = Kaminari.paginate_array(@admins_array).page(params[:page][:number]).per(10)别的@admins = @search.result(:distinct => true).page(1).per(10)@admins_json_array = Kaminari.paginate_array(@admins_array).page(1).per(10)结尾@admins_json = ActiveModel::SerializableResource.new(@admins_json_array.to_a).........结尾

解决方案

我有一个控制器,我需要在其中指定序列化器,因为需要与默认序列化器不同的属性.

在控制器中:

 定义索引搜索 = User.ransack(search_params)渲染 json: search.result, each_serializer: MembershipRenewalSerializer::MemberSerializer结尾

所以,为了让事情正常进行,如果您指定 each_serializer 选项会发生什么?

外部控制器:

ActiveModel::SerializableResource.new(用户第一(2),each_serializer: MembershipRenewalSerializer::MemberSerializer).to_json

请注意,如果不指定 each_serializerSerializableResource 将使用 UserSerializer.

编辑 #2,

@admins 数据似乎发生了一些奇怪的事情.

尝试转换为数组:

ActiveModel::SerializableResource.new(@admins.to_a).to_json

编辑 #3

要对数组进行分页,请尝试以下操作:

@search = Admin.search(params[:q])@results = @search.result(:distinct => true).to_a@admins = Kaminari.paginate_array(@results).page(params[:page]).per(10)

I am trying to send the serialized version of a model to a view as a param, using the gem active_model_serializers

#app/serializers/admin_serializer.rb
class AdminSerializer < ActiveModel::Serializer
  attributes :id, :email, :access_locked?
end


#app/controllers/dashboard/admins_controller.rb
  def index
    @search = Admin.search(params[:q])
    @admins = @search.result(:distinct => true).page(params[:page]).per(10)

    @page_entries_info = view_context.page_entries_info @admins
    # render json: @admins
    respond_to do |format|
      format.html
      format.js
      format.json {render json: @admins}
    end
  end



#app/views/dashboard/admins/index.html.erb
  <%= debug (ActiveModel::Serializer::Adapter.adapter_class(:json_api).new(ActiveModel::Serializer.serializer_for(@admins.first).new(@admins.first),{}).to_json) %>
  <%= debug (@admins.all.map{|admin| AdminSerializer.new(admin).to_json}) %>

Above debugs are yielding the below response:

--- '{"data":{"id":"1","type":"admins","attributes":{"email":"tech@bluesapling.com","access_locked?":false}}}' //returned by the first debug


---
- '{"object":{"id":36,"email":"aubrey_schmitt@feeneykoch.io","created_at":"2016-03-28T05:15:17.546Z","updated_at":"2016-03-28T05:15:17.546Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":20,"email":"alysa_johnston@thompson.io","created_at":"2016-03-28T05:15:16.304Z","updated_at":"2016-03-28T05:15:16.304Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":22,"email":"kristofer.langosh@kunzeluettgen.com","created_at":"2016-03-28T05:15:16.459Z","updated_at":"2016-03-28T05:15:16.459Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":37,"email":"beryl_keler@wiza.biz","created_at":"2016-03-28T05:15:17.624Z","updated_at":"2016-03-28T05:15:17.624Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":5,"email":"wilhelmine_buckridge@crona.io","created_at":"2016-03-28T05:15:15.139Z","updated_at":"2016-03-28T05:15:15.139Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":14,"email":"edward_wisoky@corkery.net","created_at":"2016-03-28T05:15:15.838Z","updated_at":"2016-03-28T05:15:15.838Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":27,"email":"leonor@jerde.biz","created_at":"2016-03-28T05:15:16.848Z","updated_at":"2016-03-28T05:15:16.848Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":2,"email":"carley@wyman.net","created_at":"2016-03-28T05:15:14.873Z","updated_at":"2016-03-28T05:15:14.873Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":10,"email":"ervin.gleichner@cremin.org","created_at":"2016-03-28T05:15:15.527Z","updated_at":"2016-03-28T05:15:15.527Z"},"instance_options":{},"root":null,"scope":null}'
- '{"object":{"id":15,"email":"lonzo.dickens@johnscole.name","created_at":"2016-03-28T05:15:15.916Z","updated_at":"2016-03-28T05:15:15.916Z"},"instance_options":{},"root":null,"scope":null}'

In the first debug I am serializing only one object, while in the second one I am trying to do it for an array of objects. The first debug is correctly returning the serialized version of the object(in json_api format) while second debug is not. Tried ArraySerializer as well, with no success: ActiveModel::Serializer::ArraySerializer.new(@admins, each_serializer: AdminSerializer).as_json how do I achieve the desired serialization. Moreover, if achieved, can I used some other simplified version of this? As this debug statement is way too verbose.

Tried all the solutions mentioned here - How do you initialize an ActiveModel::Serializer class with an ActiveRecord::Relation array?

The basic problem which I am trying to solve is, in the index method of the Admin controller, the Admin object is passed as a PORO to the index.html file. But I want the serialized json version of this object so that I can pass it to my react components as a prop

index method is rendering proper json on firing http://dashboard.localhost.com:3000/admins.json

UPDATE#1 for the index method

def index
    @search = Admin.search(params[:q])
    @admins_array = @search.result(:distinct => true).to_a
    if params[:page]
      @admins = @search.result(:distinct => true).page(params[:page][:number]).per(10)
      @admins_json_array = Kaminari.paginate_array(@admins_array).page(params[:page][:number]).per(10)
    else
      @admins = @search.result(:distinct => true).page(1).per(10)
      @admins_json_array = Kaminari.paginate_array(@admins_array).page(1).per(10)
    end
    @admins_json = ActiveModel::SerializableResource.new(@admins_json_array.to_a)
    ...
    ...
    ...
end

解决方案

I have a controller that I need to specify the serializer in, due to wanting different attributes from the default serializer.

In Controller:

  def index
    search = User.ransack(search_params)
    render json: search.result, each_serializer: MembershipRenewalSerializer::MemberSerializer
  end

So, just to get things working, what happens if you specify the each_serializer option?

Edits:

Outside Controller:

ActiveModel::SerializableResource.new(
  User.first(2), 
  each_serializer: MembershipRenewalSerializer::MemberSerializer
).to_json

Note, that without specifying each_serializer, SerializableResource would use the UserSerializer.

Edit #2,

It looks like there is something weird happening with the @admins data.

Try converting to an array:

ActiveModel::SerializableResource.new(@admins.to_a).to_json 

Edit #3

To paginate your array, try the following:

@search = Admin.search(params[:q])
@results = @search.result(:distinct => true).to_a
@admins = Kaminari.paginate_array(@results).page(params[:page]).per(10)

这篇关于使用 active_model_serializers 序列化模型数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆