2016-03-10 2 views
2

У меня есть сериалайзер для TimeEntry модели, которая выглядит следующим образом:Как вызвать active_model_serializer сериализации записи явно

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

    has_one :project 
end 

и она работает, как ожидается, когда я просто вернуть все записи:

def index 
    @time_entries = current_user.time_entries.all 

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

Однако, я хочу, чтобы вернуть данные, организованные в день, что-то вроде этого:

[ 
     { "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?

ответ

3

Для вызова и возможность повторного использования сериалайзер:

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