【问题标题】:Active Model Serializer - Serialize Model with multiple key and valueActive Model Serializer - 序列化具有多个键和值的模型
【发布时间】:2019-02-07 16:16:22
【问题描述】:

关于 SO 的大多数问题似乎都已经过时,无法解决这个问题。

我想序列化一个模型。 这是我的序列化程序的样子 -

class AssignmentSerializer < ActiveModel::Serializer
  belongs_to :lesson, class_name: "Lesson"
  attributes :id, :student_id, :tutor, :name, :start_date, :end_date, :description, :lesson
end

这对于您想以这种形式序列化单个对象的情况非常有效。

def index
    if current_user&.student?
        @assignments = Assignment.where(student_id: current_user.id)
        @assignments_due = Assignment.find_due(current_user)
        @submitted_assignments = Assignment.find_submitted(current_user)
    elsif current_user&.tutor?
        @assignments = Assignment.where(tutor_id: current_user.id)
    end
    respond_to do |format|
        format.json { render json: @assignments }
    end
end

但是当我想像这样序列化多个对象时不起作用:

def index
    if current_user&.student?
        @assignments = Assignment.where(student_id: current_user.id)
        @assignments_due = Assignment.find_due(current_user)
        @submitted_assignments = Assignment.find_submitted(current_user)
    elsif current_user&.tutor?
        @assignments = Assignment.where(tutor_id: current_user.id)
    end
    respond_to do |format|
        format.json { render json: {
            assignments: @assignments,
            assignments_due: @assignments_due,
            submitted_assignments: @submitted_assignments
            }, each_serializer: AssignmentSerializer
        }
    end
end

我按照在documentation 中看到的不同方法尝试了多种方法,但似乎都没有。

知道我做错了什么吗?

按照答案和评论中的建议尝试更新,但这种方法不起作用。尝试使用和不使用 each_serializer 键

respond_to do |format|
    format.json { render json: {
        assignments: @assignments.as_json,
        assignments_due: @assignments_due.as_json,
        submitted_assignments: @submitted_assignments.as_json
        }, each_serializer: AssignmentSerializer
    }
end

【问题讨论】:

  • 你试过用@assignments.as_json吗?
  • 尝试了 as_json 与 each_serializer 和没有它,仍然没有工作。

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


【解决方案1】:

显然,答案一直都在那里,只是有点混乱。 在我分享的同一个链接中,我找到了答案。 This link

所以我就是这样做的,使用ActiveModelSerializers::SerializableResource.new

def index
    if current_user&.student?
        @assignments = Assignment.where(student_id: current_user.id)
        @assignments_due = Assignment.find_due(current_user)
        @submitted_assignments = Assignment.find_submitted(current_user)
    elsif current_user&.tutor?
        @assignments = Assignment.where(tutor_id: current_user.id)
    end
    respond_to do |format|
        format.json { render json: {
            assignments: ActiveModelSerializers::SerializableResource.new(@assignments),
            assignments_due: ActiveModelSerializers::SerializableResource.new(@assignments_due),
            submitted_assignments: ActiveModelSerializers::SerializableResource.new(@submitted_assignments)
            }
        }
    end
end

这给了我想要的确切结构。

【讨论】:

【解决方案2】:

根据:https://github.com/rails/rails/blob/master/activemodel/lib/active_model/serializers/json.rb#L89

@assignments.as_json 应该使用AssignmentSerializer 序列化您的assignments,如您所愿。

【讨论】:

  • 那行不通。我会更新我的问题,向你展示我是如何使用它的。
  • 我找到了一个解决方案,感谢您花时间发布答案。看看我上面的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多