You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ActiveModel Serializer间传值?获取SegmentSerializer的patient_id

在SegmentAllSerializer中获取patient_id的几种实现方式

方法一:通过序列化上下文传递patient_id

这是最直接可靠的方式,利用ActiveModel::Serializer的选项传递机制,把当前Patient的id传递给子序列化器:

  1. 修改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
  1. 在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的信息:

  1. 修改PatientSerializer,改为序列化patient_segments关联:
class PatientSerializer < ActiveModel::Serializer
  attributes :id, :patient_name, :birthday

  has_many :patient_segments, serializer: PatientSegmentWithSegmentSerializer
end
  1. 创建新的序列化器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 14:40:57