Другим вариантом этого является использование шаблона наследования одной таблицы (STI) или наследования нескольких таблиц (MTI), но это требует некоторой доработки таблицы ActiveRecord / DB, но это может помочь другим, которые все еще находят это, которые разрабатывают его дляпервый раз.
Вот метод STI в Rails 3+: ваша концепция Eventable становится классом и нуждается в столбце type
(который автоматически заполняется для вас).
class Eventable < ActiveRecord::Base
has_one :event
end
Затем два других ваших класса наследуют от Eventable вместо AR :: Base
class Meal < Eventable
end
class Workout < Eventable
end
И ваш объект события в основном такой же, только не полиморфный:
class Event < ActiveRecord::Base
belongs_to :person
belongs_to :eventable
end
Это может сделать некоторые другие ваши слои более запутанными, если вы никогда не видели этого раньше и не проявляете осторожности.Например, к одному объекту Meal можно получить доступ в /meals/1
и /eventable/1
, если вы сделаете обе конечные точки доступными на маршрутах, и вам нужно знать класс, который вы используете, когда вы извлекаете унаследованный объект (подсказка:becomes
метод может быть очень полезен, если вам нужно переопределить поведение рельсов по умолчанию)
Но, по моему опыту, это гораздо более четкое разграничение обязанностей по мере масштабирования приложений.Просто шаблон для рассмотрения.