Car*_*nez 3 ruby ruby-on-rails active-model-serializers
我有一个TimeEntry模型的序列化器,如下所示:
class TimeEntrySerializer < ActiveModel::Serializer
attributes :id, :description, :duration
has_one :project
end
Run Code Online (Sandbox Code Playgroud)
当我只返回所有记录时,它按预期工作:
def index
@time_entries = current_user.time_entries.all
respond_to do |format|
format.html
format.json { render json: @time_entries }
end
end
Run Code Online (Sandbox Code Playgroud)
但是,我想返回按日期组织的条目,如下所示:
[
{ "2016-03-16" => [TimeEntry1, TimeEntry2, TimeEntry3] },
{ "2016-03-17" => [TimeEntry1, TimeEntry2] }
]
Run Code Online (Sandbox Code Playgroud)
我是这样做的:
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
Run Code Online (Sandbox Code Playgroud)
但是现在,序列化程序不适用于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
Run Code Online (Sandbox Code Playgroud)
在这种情况下可以使用active_model_serializer吗?如果不可能,如何才能更有效地格式化数据,避免嵌套map调用?
调用并能够重用序列化器:
options = {}
serialization = SerializableResource.new(resource, options)
serialization.to_json
serialization.as_json
Run Code Online (Sandbox Code Playgroud)
所以我这样使用它:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2853 次 |
| 最近记录: |