Sha256: aef918a752a38806d630cd934f1bda10fef871f1649f5dee6b17e652e9ca9865

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

require "enumerize_with_groups/version"
require "enumerize"

module EnumerizeWithGroups
  def self.extended(mod)
    unless mod.respond_to?(:enumerize)
      fail <<-MESSAGE
        You have to `extend Enumerize` before `extend EnumerizeWithGroups`.
      MESSAGE
    end

    mod.module_eval do
      def self.define_active_record_scope(name, key, items)
        return unless self.ancestors.include?(ActiveRecord::Base)

        scope_name = "enumerize_with_groups_#{name}_#{key}_group"
        scope scope_name, -> { where(name => items) }

        self.define_singleton_method("#{name}_#{key}_scope") do
          self.send(scope_name)
        end
      end

      def self.define_group_check_methods(name, key, items)
        define_method("in_#{name}_#{key}?") do
          fail "You have to define #{key} as group" unless items.is_a?(Array)

          items.map(&:to_s).include?(self.public_send(name))
        end
      end

      def self.define_methods_of_groups(name, groups)
        self.define_singleton_method("#{name}_groups") do
          groups
        end

        return unless groups.present?
        groups = groups.freeze

        groups.each do |key, items|
          next unless items.present?
          items = items.freeze

          self.define_singleton_method("#{name}_#{key}") do
            items
          end

          define_group_check_methods(name, key, items)
          define_active_record_scope(name, key, items)
        end
      end

      def self.enumerize(name, options = {})
        super

        define_methods_of_groups(name, options[:groups])
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
enumerize_with_groups-0.3.0 lib/enumerize_with_groups.rb