如何在ActiveModel Serializer间传值?获取SegmentSerializer的patient_id
在SegmentAllSerializer中获取patient_id的几种实现方式
方法一:通过序列化上下文传递patient_id
这是最直接可靠的方式,利用ActiveModel::Serializer的选项传递机制,把当前Patient的id传递给子序列化器:
- 修改
PatientSerializer,在关联序列化时通过pass_options传递patient_id:
class PatientSerializer < ActiveModel::Serializer attributes :id, :patient_name, :birthday has_many :segments, serializer: SegmentAllSerializer, pass_options: { patient_id: -> { object.id } } end
- 在
SegmentAllSerializer中添加patient_id属性,通过instance_options获取传递过来的值:
class SegmentAllSerializer < ActiveModel::Serializer attributes :id, :hospital_id, :segment_name, :patient_id def patient_id instance_options[:patient_id] end end
方法二:调整序列化层级,直接序列化中间关联模型
如果允许前端接收的数据结构做小调整,可以直接序列化PatientSegment模型,这样能直接拿到patient_id,同时包含Segment的信息:
- 修改
PatientSerializer,改为序列化patient_segments关联:
class PatientSerializer < ActiveModel::Serializer attributes :id, :patient_name, :birthday has_many :patient_segments, serializer: PatientSegmentWithSegmentSerializer end
- 创建新的序列化器
PatientSegmentWithSegmentSerializer,关联并序列化Segment:
class PatientSegmentWithSegmentSerializer < ActiveModel::Serializer attributes :patient_id, :segment_id belongs_to :segment, serializer: SegmentAllSerializer end
这种方式下,前端接收到的数据结构会变为:
{ "id": 1, "patient_name": "Steve", "birthday": "1986-11-02", "patient_segments": [ { "patient_id": 1, "segment_id": 1, "segment": { "id": 1, "hospital_id": 1, "segment_name": "a" } } ] }
内容的提问来源于stack exchange,提问作者Kuri
相关产品推荐
相关产品推荐

