Module: ActiveRecord::BitField::ClassMethods

Defined in:
lib/active_record/bit_field.rb

Instance Method Summary collapse

Instance Method Details

#bit_field(args = {}) ⇒ Object

Parameters:

  • args (Hash) (defaults to: {})

    オプションを含めた引数のハッシュ、キーがカラム名値の配列がフィールド名になる

Options Hash (args):

  • :invret (Boolean)

    truthyな値を渡すとビットへのマッピング時にビットが0の状態を有効に1を無効にする



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/active_record/bit_field.rb', line 38

def bit_field(args = {})
  destructed_args = args.to_a
  argument = destructed_args.shift
  options = destructed_args.to_h
  raise "can't find arguments" unless argument

  column, fields = argument
  bit_field_set_column_fields(column, fields.dup)

  mapper = bit_field_create_mapper(fields)
  bit_field_set_column_mapper(column, mapper)

  bit_field_orverride_getter_method(column, options)
  bit_field_define_setter_method(column, options)
  bit_field_define_fields_method(column, fields, options)

  fields.each do |field|
    bit_field_define_inquire_method(column, field, options)
    bit_field_define_enable_method(column, field, options)
    bit_field_define_disable_method(column, field, options)
  end
end

#bit_field_create_mapper(fields) ⇒ Object



61
62
63
64
65
66
# File 'lib/active_record/bit_field.rb', line 61

def bit_field_create_mapper(fields)
  fields.map.with_index.inject({}) do |map, (field, bit_shift)|
    map[field.to_s] = 1 << bit_shift
    map
  end
end

#bit_field_define_disable_method(column, field, options) ⇒ Object



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/active_record/bit_field.rb', line 152

def bit_field_define_disable_method(column, field, options)
  unless options[:invert]
    define_method "disable_#{column}_field" do |_field|
      bit_field_turn_bit_off_method(column, _field)
    end

    define_method "disable_#{field}" do
      bit_field_turn_bit_off_method(column, field)
    end
  else
    define_method "disable_#{column}_field" do |_field|
      bit_field_turn_bit_on_method(column, _field)
    end

    define_method "disable_#{field}" do
      bit_field_turn_bit_on_method(column, field)
    end
  end
end

#bit_field_define_enable_method(column, field, options) ⇒ Object



132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/active_record/bit_field.rb', line 132

def bit_field_define_enable_method(column, field, options)
  unless options[:invert]
    define_method "enable_#{column}_field" do |_field|
      bit_field_turn_bit_on_method(column, _field)
    end

    define_method "enable_#{field}" do
      bit_field_turn_bit_on_method(column, field)
    end
  else
    define_method "enable_#{column}_field" do |_field|
      bit_field_turn_bit_off_method(column, _field)
    end

    define_method "enable_#{field}" do
      bit_field_turn_bit_off_method(column, field)
    end
  end
end

#bit_field_define_fields_method(column, fields, options) ⇒ Object



114
115
116
117
118
# File 'lib/active_record/bit_field.rb', line 114

def bit_field_define_fields_method(column, fields, options)
  define_singleton_method "#{column}_fields" do
    bit_field_get_column_fields(column)
  end
end

#bit_field_define_inquire_method(column, field, options) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
# File 'lib/active_record/bit_field.rb', line 120

def bit_field_define_inquire_method(column, field, options)
  unless options[:invert]
    define_method "#{field}?" do
      bit_field_inquire_method(column, field)
    end
  else
    define_method "#{field}?" do
      !bit_field_inquire_method(column, field)
    end
  end
end

#bit_field_define_setter_method(column, options) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/active_record/bit_field.rb', line 102

def bit_field_define_setter_method(column, options)
  unless options[:invert]
    define_method "set_#{column}_field" do |field, value|
      bit_field_setter_method(column, field, value)
    end
  else
    define_method "set_#{column}_field" do |field, value|
      bit_field_setter_method(column, field, !value)
    end
  end
end

#bit_field_get_column_fields(column) ⇒ Object



72
73
74
# File 'lib/active_record/bit_field.rb', line 72

def bit_field_get_column_fields(column)
  instance_variable_get("@_#{column}_fields")
end

#bit_field_get_column_mapper(column) ⇒ Object



80
81
82
# File 'lib/active_record/bit_field.rb', line 80

def bit_field_get_column_mapper(column)
  instance_variable_get("@_#{column}_mapper")
end

#bit_field_orverride_getter_method(column, options) ⇒ Object



84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/active_record/bit_field.rb', line 84

def bit_field_orverride_getter_method(column, options)
  unless options[:invert]
    define_method "#{column}" do
      self.class.bit_field_get_column_fields(column).reduce({}) do |mapping, field|
        mapping[field] = bit_field_inquire_method(column, field)
        mapping
      end
    end
  else
    define_method "#{column}" do
      self.class.bit_field_get_column_fields(column).reduce({}) do |mapping, field|
        mapping[field] = !bit_field_inquire_method(column, field)
        mapping
      end
    end
  end
end

#bit_field_set_column_fields(column, fields) ⇒ Object



68
69
70
# File 'lib/active_record/bit_field.rb', line 68

def bit_field_set_column_fields(column, fields)
  instance_variable_set("@_#{column}_fields", fields)
end

#bit_field_set_column_mapper(column, mapper) ⇒ Object



76
77
78
# File 'lib/active_record/bit_field.rb', line 76

def bit_field_set_column_mapper(column, mapper)
  instance_variable_set("@_#{column}_mapper", mapper)
end