Сериализатор активной модели - Сериализация модели с несколькими ключами и значениями - PullRequest
0 голосов
/ 02 сентября 2018

Большинство вопросов по 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

Я пробовал несколько методов, следуя различным методам, которые я видел в этой документации , но, похоже, ни один из них не работает.

Есть идеи, что я могу делать не так?

Обновление попыталось, как предложено в ответе и комментарии, но этот подход не сработал. Пробовал с ключом 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

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Видимо, ответ был тут же, он был немного запутанным. В той же ссылке, которой я поделился, я нашел ответ. Эта ссылка

Так вот как я это сделал, используя 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

Это дало мне точную структуру, которую я хотел.

0 голосов
/ 02 сентября 2018

Согласно: https://github.com/rails/rails/blob/master/activemodel/lib/active_model/serializers/json.rb#L89

@assignments.as_json должен сериализовать ваш assignments, используя AssignmentSerializer, как вы хотите достичь.

...