Sha256: 10b276db659abf558e661bb3693703d740e979b22e7a67b7eeaf4952c272d0f3
Contents?: true
Size: 1.73 KB
Versions: 1
Compression:
Stored size: 1.73 KB
Contents
require "affairs_of_state/version" module AffairsOfState extend ActiveSupport::Concern class_methods do def affairs_of_state(*args) @_status_options = { column: :status, allow_blank: false, scopes: true, if: nil }.merge(args.extract_options!) @_statuses = args.flatten.map(&:to_s) const_set("STATUSES", @_statuses) validates(@_status_options[:column], inclusion: { in: @_statuses, allow_blank: @_status_options[:allow_blank] }, if: @_status_options[:if]) if @_status_options[:scopes] @_statuses.each do |status| raise ArgumentError.new("Affairs of State: '#{ status }' is not a valid status") unless valid_status?(status) self.scope status.to_sym, -> { where(@_status_options[:column] => status.to_s) } end end include InstanceMethods extend SingletonMethods true end private def valid_status?(status) ![:new].include?(status.to_sym) end end module InstanceMethods def method_missing(method, *args) if self.class::STATUSES.map{ |s| "#{ s }?".to_sym }.include?(method) self.class.send(:define_method, method) do self.status == method.to_s.gsub(/\?$/, "") end send(method) elsif self.class::STATUSES.map{ |s| "#{ s }!".to_sym }.include?(method) self.class.send(:define_method, method) do self.send("#{ self.class.instance_variable_get('@_status_options')[:column] }=", method.to_s.gsub(/\!$/, "")) self.save end send(method) else super end end end module SingletonMethods def statuses_for_select @_statuses.map{ |s| [s.humanize, s] } end end end ActiveRecord::Base.send :include, AffairsOfState
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
affairs_of_state-0.2.0 | lib/affairs_of_state.rb |