mongoid-enum
mongoid-enum copied to clipboard
Scopes can silently override existing methods
In the process of converting a project from using symbolize/mongoid to mongoid-enum, I had a model that declares the following enum:
# old symbolize/mongoid declaration
# symbolize :status, in: [:new, :success, :fail], default: :new
# new mongoid-enum declaration
enum :status, [:new, :success, :fail]
The enum declaration creates scope methods for the enum values:
MyModel.new # => Mongoid::Criteria
MyModel.success # => Mongoid::Criteria
MyModel.fail # => Mongoid::Criteria
So now mongoid-enum has overridden the new method, which blows up calls to MyModel.create or MyModel.create!.
There are a couple of ways this can be fixed (ideally, both could be implemented).
-
Add a new option to disable scopes for an enum:
enum :status, [:new, :success, :fail], :scopes => false -
Add a scope method prefix configuration option to avoid namespace collisions (e.g.,
scope_ors_for brevity):
module Mongoid
module Enum
class Configuration
attr_accessor :field_name_prefix
attr_accessor :scope_method_prefix
def initialize
self.field_name_prefix = "_"
self.scope_method_prefix = "s_"
end
end
def self.configuration
@configuration ||= Configuration.new
end
def self.configure
yield(configuration) if block_given?
end
end
end