#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.