#ruby-on-rails #inheritance
#ruby-on-rails #наследование
Вопрос:
Я программирую веб-приложение типа электронной коммерции (не совсем, но чтобы дать вам представление). Я буду отображать разные типы продуктов, которые имеют мало общего друг с другом, но я хотел бы иметь родительский класс продукта, иметь общее представление для всех подклассов и совместно использовать некоторые поля и поведение.
Но это вызывает у меня много вопросов, особенно в отношении ActiveModel: у продукта не должно быть собственной таблицы, но я бы хотел, Чтобы некоторые поля в его подклассах (отель, ресторан и т. Д.) Наследовали от него эти поля. Как бы я это сделал?
Еще одна причина иметь родительский класс Product заключается в том, что в конечном итоге мне нужно будет использовать Product .все и разные области видимости объектов класса.
Возможно, я совершенно заблуждаюсь, поэтому не стесняйтесь предлагать любой способ сделать это. Может быть, с помощью модуля?
Комментарии:
1. как насчет наследования одной таблицы?
Ответ №1:
Во-первых, наследование подразумевает, что поля наследуются; следовательно, вы не просто получаете некоторые поля, вы получаете все поля для родительского класса в подклассе.
Вы можете достичь желаемого несколькими способами:
- Создайте модуль и поместите в него все ваши общие методы и включите его в каждую модель
- Используйте
set_table_name
в подклассе, чтобы перенаправить модель на использование другой таблицы. Это полезно, если у вас есть несколько таблиц, которые используют те же поля, что и вашаproduct
таблица. - Если ваши модели используют одну и ту же таблицу, но отличаются, скажем, таким атрибутом,
product_type
который вы можете использоватьdefault_scope
, чтобы всегда применять условие, напримерdefault_scope where(:product_type => :hotel)
Используйте API в качестве ссылки для использования вышеупомянутых методов.