1

У меня есть 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 лучше (или любое другое решение)?

ответ

1

Вы хотите пойти с ИППП, поскольку это просто и будет намного быстрее, чем загрузка ассоциаций. Загрузка пучки нулевых значений не имеет отношения к производительности, а значит и к производительности. С другой стороны, объединения (или даже нетерпеливая загрузка) гораздо чаще вызывают проблемы с производительностью, как только таблица событий содержит десятки тысяч записей.

При выборе всех столбцов всегда становится проблемой для вас, вы всегда можете просто выбрать подмножество всех столбцов с:

FixedEvent.select('foo, bar').all 

Похоже, вы уже понимаете, ИППП, поэтому я не должен научите вас, как это сделать здесь. Это просто, на самом деле - просто создайте таблицу «событий» со столбцом «тип» и классом «Событие», а затем подклассифицируйте его.