From 9b55ccff4daf5f68f85f176d60c253047d45ab14 Mon Sep 17 00:00:00 2001 From: Chris Salzberg Date: Wed, 29 Nov 2017 14:19:41 +0900 Subject: [PATCH] Override _read_attribute in Dirty plugin --- lib/mobility/plugins/active_record/dirty.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/mobility/plugins/active_record/dirty.rb b/lib/mobility/plugins/active_record/dirty.rb index cb680c79b..fafac5a9d 100644 --- a/lib/mobility/plugins/active_record/dirty.rb +++ b/lib/mobility/plugins/active_record/dirty.rb @@ -34,6 +34,8 @@ def initialize(*attribute_names) define_method :previous_changes do (@previously_changed ||= ActiveSupport::HashWithIndifferentAccess.new).merge(super()) end + + define_read_attribute end # Overrides +ActiveRecord::AttributeMethods::ClassMethods#has_attribute+ to treat fallthrough attribute methods @@ -52,6 +54,22 @@ def included(model_class) end model_class.extend has_attribute end + + private + + def define_read_attribute + names = @attribute_names + method_name_regex = /\A(#{names.join('|'.freeze)})_([a-z]{2}(_[a-z]{2})?)(=?|\??)\z/.freeze + define_method :_read_attribute do |attr, *args| + if @attributes.key?(attr) + super(attr, *args) + elsif names.include?(attr) || method_name_regex.match?(attr) + __send__(attr) + else + super(attr, *args) + end + end + end end end end