使用active_model_serializers将模型序列化到Rails中的json字段

时间:2016-10-20 23:01:54

标签: ruby-on-rails json serialization

我有一个如下所示的Task模型:

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

带有json字段metadata的Sprint:

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
    object&.owner&.full_name
  end

  def asignee_name
    object&.asignee&.full_name
  end

  def asignee_email
    object&.asignee&.email
  end
end

如何使用active_model_serializers将有效的JSON对象存储在rails json字段中?如果不可能,我如何查询关联数据作为存储在metadata字段中的有效JSON对象?

1 个答案:

答案 0 :(得分:0)

我能够使用as_json代替to_json来获取我需要的哈希。

  

as_json(options = nil)

     

返回表示模型的哈希。一些   配置可以通过选项传递。

     

选项include_root_in_json控制的顶级行为   as_json。如果为true,as_json将发出以。之后命名的单个根节点   对象的类型。 include_root_in_json选项的默认值为   假的。