如何调用 active_model_serializer 以显式序列化记录

How to call an active_model_serializer to serialize records explicitly

我有一个 TimeEntry 模型的序列化程序,如下所示:

class TimeEntrySerializer < ActiveModel::Serializer
  attributes :id, :description, :duration

  has_one :project
end

当我 return 所有记录时,它按预期工作:

def index
    @time_entries = current_user.time_entries.all

    respond_to do |format|
      format.html
      format.json { render json: @time_entries }
    end
end

但是,我想return按天组织条目,像这样:

[
      { "2016-03-16" => [TimeEntry1, TimeEntry2, TimeEntry3] },
      { "2016-03-17" => [TimeEntry1, TimeEntry2] }
]

我的模型是这样的:

def self.get_entries_for_user(current_user)
    current_user.time_entries
    .group_by { |item| item.created_at.to_date.to_s }
    .map { |day, entries| { day => entries  } }
end

但是现在,序列化程序不适用于 TimeEntry 对象,我不太确定它是否真的应该在这种情况下工作...我想避免自己格式化数据:

def self.get_entries_for_user(current_user)
    current_user.time_entries
    .group_by { |item| item.created_at.to_date.to_s }
    .map do |day, entries|
      {
        day => entries.map do |entry|
          {
            :id => entry.id,
            :description => entry.description,
            :duration => entry.duration_ms,
            :start_time => entry.time.begin,
            :end_time => entry.time.end,
            :project_id => entry.project.id
          }
        end
      }
    end
end

这种情况可以使用active_model_serializer吗?如果不可能,我怎样才能更有效地格式化数据以避免嵌套的 map 调用?

要调用并能够重用序列化程序:

options = {}
serialization = SerializableResource.new(resource, options)
serialization.to_json
serialization.as_json

所以我是这样使用的:

def self.get_entries_for_user(current_user)
    current_user.time_entries
    .group_by { |item| item.created_at.to_date.to_s }
    .map do |day, entries|
      {
        :day => day,
        :entries => entries.map do |entry|
          entry = ActiveModel::SerializableResource.new(entry)
          entry.as_json
        end
      }
    end
end