Создание подклассов в моделях Rails и ActiveRecord

#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 в качестве ссылки для использования вышеупомянутых методов.