如何从Rails ActiveModelSerializers返回父数据?

时间:2016-09-30 15:13:44

标签: ruby-on-rails active-model-serializers

如何从Rails ActiveModelSerializers返回父数据?

这是我的模特

class User < ActiveRecord::Base

  has_many :user_groups ,dependent: :destroy
  has_many :groups , through: :user_groups

end

class Group < ActiveRecord::Base

  has_many :user_groups ,dependent: :destroy
  has_many :users , through: :user_groups

end

class UserGroup < ActiveRecord::Base

  belongs_to :user
  belongs_to :group

end

这是我的序列化程序

class UserSerializer < ActiveModel::Serializer
  attributes :id ,:email, :username, :fullname, :grade,:auth_token

  has_many :user_groups

end

class GroupSerializer < ActiveModel::Serializer
  attributes :id ,:name ,:court_price ,:shuttle_price
  has_many :user_groups
end

class UserGroupSerializer < ActiveModel::Serializer
  attributes :id , :level

  belongs_to :user_id

end

这是我的控制器

def member_list
  group = current_user.groups.find_by(id: params[:id])

  respond_with group
end

所以我想用User数据返回UserGroup数据,但这就是我得到的。

enter image description here

{
  "id": 35,
  "name": "test 01",
  "court_price": 150,
  "shuttle_price": 12,
  "user_groups": [
    {
      "id": 30,
      "level": "player"
    },
    {
      "id": 29,
      "level": "owner"
    }
  ]
}

如何在user_groups数组中返回用户数据? 谢谢!

1 个答案:

答案 0 :(得分:1)

你必须小心那里的循环引用。 Group嵌入UserGroup嵌入User,嵌入UserGroup

对于这种情况,我建议为没有关系的用户创建自定义序列化程序。例如ShallowUserSerializer。

class ShallowUserSerializer < ActiveModel::Serializer
  attributes :id ,:email, :username, :fullname, :grade,:auth_token
end

除此之外,UserGroupSerializer存在一些问题。 active_model_serializer的文档状态:

  

序列化程序只关注多重性,而不是所有权。   belongs_to可以使用has_one in包含ActiveRecord关联   你的序列化器。

所以你可以像这样重写它:

class UserGroupSerializer < ActiveModel::Serializer
  attributes :id , :level
  has_one :user, serializer: ShallowUserSerializer
end