Общий атрибут в моделях Enumerize - PullRequest
0 голосов
/ 16 ноября 2018

Я использую гем Enumerize и хотел бы создать Enum, который будет использоваться двумя моделями.

Моя модель с Enum выглядит так:

class StudyTypeEnum < ApplicationRecord

  extends Enumerize
  enumerize :studytype, in: {:full_time, :part_time}

end

а потом я просто включаю его в другие модели

class Course < ApplicationRecord

  include StudyTypeEnum
  ...

Я не уверен, как создать миграцию сейчас, нужно ли создавать столбцы StudyType в моделях StudyTypeEnum и Course?

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

В Ruby классы не могут быть включены в другие классы - могут только модули. Классы могут использоваться только для «классического» вертикального наследования (класс наследуется от одного базового класса).

module StudyTypeEnum
  def self.included(base)
    base.extend Enumerize
    base.class_eval do
      enumerize :studytype, in: {:full_time, :part_time}
    end
  end
end

Поскольку код должен выполняться в контексте класса, включающего модуль, нам необходимо определить метод self.included, который вызывается при включении класса. Вы также можете использовать ActiveSupport::Concern, который охватывает эту распространенную идиому Ruby.

class Course < ApplicationRecord
  include StudyTypeEnum
end

Я не уверен, как создать миграцию сейчас, мне нужно создать Столбцы StudyType в моделях StudyTypeEnum и Course?

Поскольку StudyTypeEnum является модулем, который смешан с классами моделей, у него есть таблица.

Вам нужно только добавить столбец к фактическим моделям - в данном случае к Курсу - и к любой другой модели, в которую вы планируете включить StudyTypeEnum.

0 голосов
/ 16 ноября 2018

Я бы хотел, чтобы пользователи беспокоились о таком поведении.

в файле: app/models/concerns/enumerable_study.rb

module EnumerableStudy
  extend ActiveSupport::Concern
  extends Enumerize

  included do
    enumerize :studytype, in: {:full_time, :part_time}
  end
end

, а затем, если это необходимо для любой из ваших моделей, просто сделайте:

например, в файле: app/models/course

class Course < ApplicationRecord
  include EnumerableStudy
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...