Rails 4 - Загрузка ассоциаций ActiveRecord и вывод в виде JSON

У меня есть следующая схема для отображения событий с FullCalendar:

class Event < ActiveRecord::Base
  has_many :event_occurrences, dependent: :destroy

  def as_json(options = {})
   {
  :id => self.id,
  :title => self.name,
  :start => start_time.rfc822,
  :end => end_time.rfc822,
  }
  end
end

class EventOccurence < ActiveRecord::Base
  belongs_to :event
end

Структура объекта Event (для краткости я удалил некоторые поля):

   => Event(id: integer, name: string, start_time: datetime, end_time: datetime)

Структура объекта EventOccurence:

   => EventOccurrence(id: integer, event_id: integer, date: datetime) 

Вывод JSON будет выглядеть так:

 {:id=>1, :title=>"Your title", :location=>"Bermuda", :start=>"Sun, 05 Jan 2014 02:50:07 +0000", :end=>"Sun, 05 Jan 2014 02:51:46 +0000"}

Причина, по которой у меня есть отдельная модель EventOccurence, заключается в том, чтобы хранить повторяющиеся события отдельно, как было предложено в этом посте Stackru, так как я также пытаюсь создать отдельную таблицу соединений для хранения повторяющихся событий.

В настоящее время я могу запрашивать только объекты событий, которые подходят для FullCalendar. Однако объекты Associations или EventOccurrence не отображаются с использованием этого:

@events = Event.all.includes(:event_occurrences)

Вот что я сейчас пытаюсь:

calendar.js.erb

....
eventSources: [{
        url: '/calendar/index'
    }],
....

calendar_controller.erb

def index
  @events = Event.all.includes(:event_occurrences)

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @events }
  end
end

Я иду об этом правильным путем? Нужно ли моей модели EventOccurrence дополнительные поля?

РЕДАКТИРОВАТЬ 1:

Позвольте мне сделать все возможное, чтобы заявить, что я пытаюсь достичь:

  1. У меня есть календарь с событиями.
  2. Некоторые из этих событий являются "повторяющимися" событиями.
    => С этими повторяющимися событиями я бы хотел сохранить их отдельно в таблицу "соединения", чтобы они могли быть отфильтрованы в параметрах заданного месяца при запросе. (как предложено здесь).

Мои модели выше, а Event а также EventOccurrence, В настоящее время это работает так:

  1. Если событие не повторяется, то его основные данные хранятся в Event модель (:name, :start_time, :end_time).
  2. Если событие повторяется, то это основная информация (:name, :start_time, :end_time) хранится в Event модель, а затем, все ее последующие вхождения хранятся в EventOccurrence модель (:event_id, :date). Я опустил (:start_time а также :end_time) от EventOccurrence модель, потому что я предположил, что это будет обрабатываться его родителем в Event модель.

Это лучший способ для хранения и извлечения событий на основе сценария, который я предоставил выше?

2 ответа

Решение

Хорошо, я понял, что мне нужно делать. С некоторыми изменениями в моих моделях я придумал:

 --- !ruby/object:Event
   attributes:
   id: 
   name: 
   details: 
   location: 
   etc...

А также

 --- !ruby/object:EventOccurrence
   attributes:
   id: 
   event_id:  
   start_time: 
   end_time:

И затем, для JSON, который любит FullCalendar:

def index
@events = Event.all
@hash = []
@events.each do |e|
    @occurrences = e.event_occurrences
    @occurrences.each do |occurrence|
        @hash << {
          :id => e.id,
          :title => e.name,
          :location => e.location,
          :details => e.details,
          :start => occurrence.start_time.rfc822,
          :end => occurrence.end_time.rfc822,
        }
    end
end

   respond_to do |format|
     format.html # index.html.erb
     format.json { render json: @hash }
   end
end

И это заставило все мои события отображаться правильно.

def index
  @events = Event.all

  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @events.to_json(include: :event_occurrences) }
  end
end
Другие вопросы по тегам