Сериализация моделей в поле json в Rails с использованием active_model_serializers

#ruby-on-rails #json #serialization

#ruby-on-rails #json #сериализация

Вопрос:

У меня есть модель задачи, которая выглядит следующим образом:

 class Task
   # has a title
   belongs_to :owner, class_name: "User"
   belongs_to :asignee, class_name: "User
end
  

И спринт с полем json metadata :

 create_table :sprints, id: :uuid do |t|
  t.json :metadata
end

class Sprint
    def close_sprint
        self.metadata = serialized_tasks
        self.save
    end
end
  

Я использую активные сериализаторы моделей для сериализации sprint tasks следующим образом:

 def serialized_tasks
   ActiveModel::Serializer::CollectionSerializer.new(self.tasks, serializer: TaskSerializer).to_json
end
  

Проблема в том, что он хранит данные задач как json string , а не как объект json.

Сериализатор выглядит следующим образом:

 class TaskSerializer < ActiveModel::Serializer
  attributes :title, :owner_name, :created_at, :status, :asignee_name, :asignee_email

  def owner_name
    objectamp;.owneramp;.full_name
  end

  def asignee_name
    objectamp;.asigneeamp;.full_name
  end

  def asignee_email
    objectamp;.asigneeamp;.email
  end
end
  

Как я могу получить действительный объект JSON для сохранения в поле rails json с использованием active_model_serializers? Если это невозможно, как я могу запросить связанные данные как допустимый объект JSON для сохранения в metadata поле?

Ответ №1:

Я смог получить необходимый мне хэш, используя as_json вместо to_json .

as_json(параметры = nil)

Возвращает хэш, представляющий модель. Некоторая конфигурация может быть передана через options.

Параметр include_root_in_json управляет поведением as_json на верхнем уровне. Если значение true, as_json создаст единственный корневой узел, названный в честь типа объекта. Значение по умолчанию для параметра include_root_in_json равно false.