Sha256: 22d69ffa5b9916b87642fcf474704e89d5249a4da12297135d1602711c02fbbf

Contents?: true

Size: 1.39 KB

Versions: 5

Compression:

Stored size: 1.39 KB

Contents

module Enumerations
  module FinderMethods
    # Finds an enumeration by symbol or name
    #
    # Example:
    #
    #   Role.find(:admin)  => #<Enumerations::Value: @base=Role, @symbol=:admin...>
    #   Role.find('staff') => #<Enumerations::Value: @base=Role, @symbol=:staff...>
    #
    def find(key)
      case key
      when Symbol, String, Enumerations::Base then find_by_key(key.to_sym)
      end || find_by_primary_key(key)
    end

    # Finds all enumerations which meets given attributes.
    # Similar to ActiveRecord::QueryMethods#where.
    #
    # Example:
    #
    #   Role.find_by(name: 'Admin') => #<Enumerations::Value: @base=Role, @symbol=:admin...>
    #
    def where(**args)
      _values.values.select { |value| args.map { |k, v| value.attributes[k] == v }.all? }
    end

    # Finds an enumeration by defined attribute. Similar to ActiveRecord::FinderMethods#find_by
    #
    # Example:
    #
    #   Role.find_by(name: 'Admin') => #<Enumerations::Value: @base=Role, @symbol=:admin...>
    #
    def find_by(**args)
      where(**args).first
    end

    def find_by_key(key)
      _values[key]
    end

    def find_by_primary_key(primary_key)
      return value_from_symbol_index(primary_key.to_i) if primary_key.is_a?(String)

      value_from_symbol_index(primary_key)
    end

    private

    def value_from_symbol_index(key)
      _values[_symbol_index.key(key)]
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
enumerations-2.6.0 lib/enumerations/finder_methods.rb
enumerations-2.5.4 lib/enumerations/finder_methods.rb
enumerations-2.5.3 lib/enumerations/finder_methods.rb
enumerations-2.5.2 lib/enumerations/finder_methods.rb
enumerations-2.5.1 lib/enumerations/finder_methods.rb