Refactor how a few ActiveRecord enums are defined
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?
- https://gitlab.com/gitlab-org/gitlab-ee/issues/8244
- https://gitlab.com/gitlab-org/gitlab-ee/issues/8241
Does this MR meet the acceptance criteria?
-
Conforms to the code review guidelines -
Conforms to the merge request performance guidelines -
Conforms to the style guides -
Conforms to the database guides