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:
Позвольте мне сделать все возможное, чтобы заявить, что я пытаюсь достичь:
- У меня есть календарь с событиями.
- Некоторые из этих событий являются "повторяющимися" событиями.
=> С этими повторяющимися событиями я бы хотел сохранить их отдельно в таблицу "соединения", чтобы они могли быть отфильтрованы в параметрах заданного месяца при запросе. (как предложено здесь).
Мои модели выше, а Event
а также EventOccurrence
, В настоящее время это работает так:
- Если событие не повторяется, то его основные данные хранятся в
Event
модель (:name, :start_time, :end_time
). - Если событие повторяется, то это основная информация (
: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