代码之家  ›  专栏  ›  技术社区  ›  Jeremy Thomas

复杂关联的ActiveModel序列化程序

  •  0
  • Jeremy Thomas  · 技术社区  · 6 年前

    我有两个相关模型:

    class User < ActiveRecord::Base
        has_many :notifications, foreign_key: :recipient_id
    end
    
    class Notification < ActiveRecord::Base
        belongs_to :recipient, class_name: 'User'
        belongs_to :actor, class_name: 'User'
        belongs_to :notifiable, polymorphic: true
    end
    

    当我加载 :user :

    class API::UserSerializer < ActiveModel::Serializer
        attributes :id, :email, :auth_token, :location_id, :notifications
    
        has_many :notifications, foreign_key: :recipient_id, each_serializer: API::NotificationSerializer
    end
    

    它反过来使用序列化程序 :notifications :

    class API::NotificationSerializer < ActiveModel::Serializer
        attributes :id, :recipient_id, :actor_id, :notifiable_id, :read_at, :action, :recipient, :actor, :notifiable_type
    
        belongs_to :recipient, serializer: API::RecipientSerializer
        belongs_to :actor
        belongs_to :notifiable, polymorphic: true
    end
    

    然而, 这个 API::RecipientSerializer 从未使用过,而是整个 :recipient 返回。我做错什么了?


    还有,这是 API::RecipientSerializer 对于良好的测量:

    class API::RecipientSerializer < ActiveModel::Serializer
        attributes :id
    end
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Marcin Kołodziej    6 年前

    两个问题:

    1. 检查这个 link . 你需要设置 ActiveModel::Serializer.config.default_includes = '**' 如果希望关系保持递归呈现(或在序列化对象时将其设置为所需的任何值)。
    2. 不向添加关系 attributes (删除) :recipient 属性 在里面 NotificationSerializer )这可能有效,因为您的关系将覆盖该属性,但没有理由让它们发生冲突。

    编辑 :因为设置 default_includes ,在呈现最终结果时需要一个特定的:

    render json: user, include: ['notifications', 'notifications.recipient'], status: :ok