共享属性累计模型枚举

时间:2018-11-16 09:54:45

标签: ruby-on-rails rubygems

我正在使用Enumerize gem,我想创建一个在两个模型之间共享的Enum。

我的Enum模型如下:

class StudyTypeEnum < ApplicationRecord

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

end

然后我将其包含在其他模型中

class Course < ApplicationRecord

  include StudyTypeEnum
  ...

我不确定现在如何创建迁移,是否需要在StudyTypeEnum和Course模型中都创建StudyType列?

2 个答案:

答案 0 :(得分:0)

我希望用户关注这种行为。

文件中的

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

答案 1 :(得分:0)

在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
  

我不确定现在如何创建迁移,我是否需要创建迁移   StudyTypeEnum和Course模型中的StudyType列?

由于StudyTypeEnum是一个混入模型类的模块,因此它确实具有表。

您只需要将该列添加到实际模型(在本例中为Course),并计划将其包括StudyTypeEnum在内的任何其他模型添加。