Skip to content

Commit cef42e6

Browse files
authored
Merge pull request rails#46490 from alfie-max/disable_enum_methods
option to disable all methods that ActiveRecord.enum generates
2 parents bd47a6e + 61b8253 commit cef42e6

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

activerecord/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
* Allow disabling methods generated by `ActiveRecord.enum`.
2+
3+
*Alfred Dominic*
4+
15
* Avoid validating `belongs_to` association if it has not changed.
26

37
Previously, when updating a record, Active Record will perform an extra query to check for the presence of

activerecord/lib/active_record/enum.rb

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,14 @@ def enum(name = nil, values = nil, **options)
179179
return _enum(name, values, **options)
180180
end
181181

182-
definitions = options.slice!(:_prefix, :_suffix, :_scopes, :_default)
182+
definitions = options.slice!(:_prefix, :_suffix, :_scopes, :_default, :_instance_methods)
183183
options.transform_keys! { |key| :"#{key[1..-1]}" }
184184

185185
definitions.each { |name, values| _enum(name, values, **options) }
186186
end
187187

188188
private
189-
def _enum(name, values, prefix: nil, suffix: nil, scopes: true, **options)
189+
def _enum(name, values, prefix: nil, suffix: nil, scopes: true, instance_methods: true, **options)
190190
assert_valid_enum_definition_values(values)
191191
# statuses = { }
192192
enum_values = ActiveSupport::HashWithIndifferentAccess.new
@@ -222,14 +222,14 @@ def _enum(name, values, prefix: nil, suffix: nil, scopes: true, **options)
222222

223223
value_method_name = "#{prefix}#{label}#{suffix}"
224224
value_method_names << value_method_name
225-
define_enum_methods(name, value_method_name, value, scopes)
225+
define_enum_methods(name, value_method_name, value, scopes, instance_methods)
226226

227227
method_friendly_label = label.gsub(/[\W&&[:ascii:]]+/, "_")
228228
value_method_alias = "#{prefix}#{method_friendly_label}#{suffix}"
229229

230230
if value_method_alias != value_method_name && !value_method_names.include?(value_method_alias)
231231
value_method_names << value_method_alias
232-
define_enum_methods(name, value_method_alias, value, scopes)
232+
define_enum_methods(name, value_method_alias, value, scopes, instance_methods)
233233
end
234234
end
235235
end
@@ -245,14 +245,16 @@ def initialize(klass)
245245
private
246246
attr_reader :klass
247247

248-
def define_enum_methods(name, value_method_name, value, scopes)
249-
# def active?() status_for_database == 0 end
250-
klass.send(:detect_enum_conflict!, name, "#{value_method_name}?")
251-
define_method("#{value_method_name}?") { public_send(:"#{name}_for_database") == value }
248+
def define_enum_methods(name, value_method_name, value, scopes, instance_methods)
249+
if instance_methods
250+
# def active?() status_for_database == 0 end
251+
klass.send(:detect_enum_conflict!, name, "#{value_method_name}?")
252+
define_method("#{value_method_name}?") { public_send(:"#{name}_for_database") == value }
252253

253-
# def active!() update!(status: 0) end
254-
klass.send(:detect_enum_conflict!, name, "#{value_method_name}!")
255-
define_method("#{value_method_name}!") { update!(name => value) }
254+
# def active!() update!(status: 0) end
255+
klass.send(:detect_enum_conflict!, name, "#{value_method_name}!")
256+
define_method("#{value_method_name}!") { update!(name => value) }
257+
end
256258

257259
# scope :active, -> { where(status: 0) }
258260
# scope :not_active, -> { where.not(status: 0) }

activerecord/test/cases/enum_test.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,4 +1020,15 @@ def self.name
10201020
end
10211021
assert_equal "Unknown enum attribute 'columnless_genre' for Book", error.message
10221022
end
1023+
1024+
test "default methods can be disabled by :_instance_methods" do
1025+
klass = Class.new(ActiveRecord::Base) do
1026+
self.table_name = "books"
1027+
enum status: [:proposed, :written], _instance_methods: false
1028+
end
1029+
1030+
instance = klass.new
1031+
assert_raises(NoMethodError) { instance.proposed? }
1032+
assert_raises(NoMethodError) { instance.proposed! }
1033+
end
10231034
end

0 commit comments

Comments
 (0)