Module: EnumSet::ClassMethods

Defined in:
lib/enum_set.rb

Instance Method Summary collapse

Instance Method Details

#enum_set(enums) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/enum_set.rb', line 9

def enum_set(enums)
  enums.each do |column, names|
    names.map!(&:to_sym)
    names_with_bits = names.each_with_index.map { |name, i| [name, 1 << i] }

    define_method :"#{column}_bitfield" do
      self[column] || 0
    end

    names_with_bits.each do |name, bit|
      define_method :"#{name}?" do
        (bit & send("#{column}_bitfield")) != 0
      end

      scope :"#{name}", -> {
        where("#{column} & ? <> 0", bit)
      }
    end

    define_method :"#{column}=" do |array|
      array.each do |val|
        bit = names_with_bits.find { |name,_| name == val.to_sym }.last
        new_value = send("#{column}_bitfield") | bit
        self[column] = new_value
      end

      send(column)
    end

    define_method column do
      names.select { |name| send(:"#{name}?") }
    end
  end
end