Mongoid::Enum
Enum implementation for Mongoid. Similar to that found in ActiveRecord.
Installation
gem "mongoid_enum"
Usage
By default values saved to DB are strings matching enum labels.
class Conversation
include Mongoid::Document
include Mongoid::Enum
enum status: [ :active, :archived ]
end
conversation = Conversation.active.first
conversation.active? # true
conversation.archived! # immediately saves document
conversation.active? # false
conversation["status"] # "archived"
You can use other Mongo value types (numbers, booleans, nil) when explicitly defining the enum mapping:
class Part
include Mongoid::Document
include Mongoid::Enum
enum quality_control: {pending: nil, passed: true, failed: false}, _prefix: :qc
end
part = Part.qc_pending.first
part.qc_pending? # true
part["quality_control"] # nil
part.quality_control # "pending"
part.qc_passed!
part.quality_control # "passed"
part["quality_control"] # true
Enum values are validated.
part.quality_control = "unknown value"
part.valid? # false
You can access the mapping as hash with indifferent access via class level constant. Constant name is a pluralized field name set in SCREAMING_SNAKE_CASE.
Part::QUALITY_CONTROLS["passed"] # true
Part::QUALITY_CONTROLS[:failed] # false
You might prefer to use plural scopes if your field values are nouns:
class Attachment
include Mongoid::Document
include Mongoid::Enum
enum type: %w{image video}, _plural_scopes: true
end
Attachment.videos.count
Read more in documentation.
Differences from ActiveRecord
Default values are strings, not integers. I think it fits MongoDB better.
Mapping hash is accessible via class constant instead of class method. I prefer constant because it is accessible without prefix both on class methods and instance methods. Also I think SCREAMING_SNAKE_CASE is less likely to cause name conflicts.
I do not raise exception when invalid value is assigned. Instead document fails validation. Assigned invalid value is remembered and can be corrected in forms. Exception will still be raised if you try to save invalid label by skipping validation (
save validate: false
). That's because the document does not know how to convert invalid enum option to database value.
Credits
Original implementation for ActiveRecord was created by David Heinemeier Hansson. Following modifications by other Rails contributors. Port to Mongoid prepared by Adam Wróbel.