Skip to content

Refactor how a few ActiveRecord enums are defined

Yorick Peterse requested to merge refactor-enums-for-ee into master

What does this MR do?

In a few models we define ActiveRecord enums that are redefined in EE using the following pattern:

enum :some_enum, {
  ...
}.merge(EE_ENUM_VALUES)

This particular approach is problematic to deal with, because it requires that we prepend and EE module before defining the enum. This typically translates to the prepend being the first line in the model in EE, but this can easily lead to merge conflicts when developers add more include and/or prepend lines.

As part of https://gitlab.com/gitlab-org/gitlab-ee/issues/8244 and https://gitlab.com/gitlab-org/gitlab-ee/issues/8241 we are moving prepend to the last line in a file, reducing the chances of running into merge conflicts. This poses a bit of a problem with the pattern above, because this pattern does not allow us to move the prepend further down a file.

To resolve this problem, we simply move the Hash value of the enum to a separate class method. This method is defined in a separate module where necessary, allowing us to use it like so:

enum :failure_reasons, ::SomeModelEnums.failure_reasons

The method in turn is defined in a very straightforward manner:

module SomeModelEnums
  def self.failure_reasons
    {
      ...
    }
  end
end

This makes it easy for EE to add values without requiring the prepend to be placed before the enum is defined.

EE MR: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/8469

What are the relevant issue numbers?

Does this MR meet the acceptance criteria?

Edited by Yorick Peterse

Merge request reports