我正在使用活动模型序列化程序 gem,它现在工作正常。但是,我偶然发现了一个问题,我不想停止对检索到的数据进行嵌套。
假设我有 3 个模型:
Users
谁has_many orders
谁has_many addresses
.
通常在我的Users serializer class
中,我会对orders model
有一个has_many
,并且在订单中模型序列化程序与addresses
有has_many
关系。
我现在有一个用户控制器,我不想把订单放出来,但不想放嵌套地址。可以在不创建全新序列化程序类的情况下完成此操作吗?
更新,以澄清:
我有以下3种型号:
class User < ActiveRecord::Base
has_many orders
end
class Orders < ActiveRecord::Base
belongs_to user
has_many addresses
end
class Addresses < ActiveRecord::Base
belongs_to order
end
我有 3 个与模型相同的序列化程序。
对于我的订单API,我也想检索地址,但是当我查询用户时,我只想要关联的订单而不是地址。就像现在一样,当我查询用户时,它都会返回所有订单和地址,因为我对订单中的地址has_many。
是为两个选项创建单独的序列化程序的唯一选择(只是感觉不是很干燥(?
可以使用default_serializer_options定义序列化程序选项的方法 此控制器使用的所有序列化程序及其子级。
#users_controller.rb
class UsersController < ApplicationController
def default_serializer_options
{ include_addresses: false }
end
end
然后重写订单序列化程序中的初始化方法以检查include_addresses标志的序列化程序选项:
# order_serializer.rb
class OrderSerializer < ActiveModel::Serializer
def initialize(object, options = {})
options.reverse_merge! include_addresses: true # by default it should include addresses
@include_addresses = options[:include_addresses]
super
end
def include_addresses?
@include_addresses
end
end
仅此而已。在不需要嵌套地址的每个控制器中指定此选项。
您可以从序列化程序中删除has_many
,它将停止包含关联。