Created
January 10, 2013 12:10
-
-
Save cjbell/4501568 to your computer and use it in GitHub Desktop.
Ultra simple state for models.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module CanHaveState | |
def can_have_state(states = {}) | |
class_eval do | |
const_set("STATES", states.freeze) | |
const_set("STATE_CODE_TO_NAME", self::STATES.invert.freeze) | |
states.each do |type, value| | |
# Create some helper methods and scopes | |
scope type, where(:state => value) | |
define_method "#{ type.to_s }?" do | |
self.state == value | |
end | |
define_method type.to_s do | |
self.state = value | |
end | |
end | |
def self.states | |
self::STATES.keys | |
end | |
def self.state_code(name) | |
name = name.to_sym | |
raise ArgumentError, "#{name} not a valid state" unless self::STATES.has_key?(name) | |
self::STATES[name] | |
end | |
def self.state_name(code) | |
raise ArgumentError, "#{code} not a valid state" unless self::STATES.has_value?(code) | |
self::STATE_CODE_TO_NAME[code].to_s | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment