У меня есть Event
модель, и я хочу, чтобы создать два подкласса него: FixedEvent
и TasksEvent
Реализация модели подклассы - правильный путь
модель событий имеет следующие атрибуты:
uid :string
title :string
starts_at :datetime
ends_at :datetime
FixedEvent наследуемые от событий и также этот атрибут:
all_day :boolean
TasksEvent наследуется от Event и имеет следующие атрибуты:
task_id :integer
occurrence :integer
(Атрибут Occurrence - это особый способ выполнения задач: выполнять эту задачу два раза/три раза. Возникновение представляет, какое возникновение задачи это (например, это второй раз, когда пользователь выполняет задачу)
Вчера я провел целый день, читая о одиночных наследованиях и полиморфных ассоциациях, и я все еще не уверен на 100%, что правильный способ реализовать это в Rails.
Однозначное наследование оставляет меня с множеством нулевых значений в моей базе данных, так как в итоге у меня будет одна таблица с: uid, title, starts_at, ends_at, all_day, task_id, появление, тип. Повлияет ли это поведение сервера на более медленное, поскольку рельсы будут извлекать больше (нулевых) данных для каждого запроса на события?
С другой стороны, Полиморфные ассоциации больше похожи на то, что я добавляю некоторые дополнительные функции для моделирования, а не для их подклассификации. Кроме того, он создает несколько таблиц (три в данном случае) в БД:
events:
id, uid, title, starts_at, ends_at,
created_at, updated_at,
event_type_id, event_type_type
(предложить более именование для типа если что-то приходит на ум)
fixed_events:
id
all_day
created_at
updated_at
tasks_events:
id
task_id
occurrence
created_at
updated_at
Будет ли это поведение сделать ответ сервера медленнее rails придется делать несколько db-соединений каждый раз, когда я хочу получить все атрибуты FixedEvent/TasksEvent?
Также, как я могу создать новые объекты ActiveRecord с использованием STI и/или полиморфных ассоциаций? я пытался что-то подобное для полиморфной ассоциации:
def new
@fixed_event = FixedEvent.new
@fixed_event.build_event
respond_to :html
end
, а затем в form_for:
= f.fields_for :event do |event|
.field
= event.label :title
= event.text_field :title
.field
= event.label :starts_at
= event.datetime_select :starts_at
.field
= event.label :ends_at
= event.datetime_select :ends_at
.field
= event.label :description
= event.text_field :description
.field
= event.label :uid
= event.text_field :uid
мне пришлось добавить эти две вещи в FixedEvent
и TasksEvent
и она работала:
attr_accessible :event_attributes
accepts_nested_attributes_for :event
Правильно ли это, или STI лучше (или любое другое решение)?