Skip to content
This repository
tag: v1.2.6
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 76 lines (67 sloc) 2.391 kb
1 2 3 4 5 6 7 8 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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
module ActiveRecord
  module AttributeMethods #:nodoc:
    DEFAULT_SUFFIXES = %w(= ? _before_type_cast)

    def self.included(base)
      base.extend ClassMethods
      base.attribute_method_suffix *DEFAULT_SUFFIXES
    end

    # Declare and check for suffixed attribute methods.
    module ClassMethods
      # Declare a method available for all attributes with the given suffix.
      # Uses method_missing and respond_to? to rewrite the method
      # #{attr}#{suffix}(*args, &block)
      # to
      # attribute#{suffix}(#{attr}, *args, &block)
      #
      # An attribute#{suffix} instance method must exist and accept at least
      # the attr argument.
      #
      # For example:
      # class Person < ActiveRecord::Base
      # attribute_method_suffix '_changed?'
      #
      # private
      # def attribute_changed?(attr)
      # ...
      # end
      # end
      #
      # person = Person.find(1)
      # person.name_changed? # => false
      # person.name = 'Hubert'
      # person.name_changed? # => true
      def attribute_method_suffix(*suffixes)
        attribute_method_suffixes.concat suffixes
        rebuild_attribute_method_regexp
      end

      # Returns MatchData if method_name is an attribute method.
      def match_attribute_method?(method_name)
        rebuild_attribute_method_regexp unless defined?(@@attribute_method_regexp) && @@attribute_method_regexp
        @@attribute_method_regexp.match(method_name)
      end

      private
        # Suffixes a, ?, c become regexp /(a|\?|c)$/
        def rebuild_attribute_method_regexp
          suffixes = attribute_method_suffixes.map { |s| Regexp.escape(s) }
          @@attribute_method_regexp = /(#{suffixes.join('|')})$/.freeze
        end

        # Default to =, ?, _before_type_cast
        def attribute_method_suffixes
          @@attribute_method_suffixes ||= []
        end
    end

    private
      # Handle *? for method_missing.
      def attribute?(attribute_name)
        query_attribute(attribute_name)
      end

      # Handle *= for method_missing.
      def attribute=(attribute_name, value)
        write_attribute(attribute_name, value)
      end

      # Handle *_before_type_cast for method_missing.
      def attribute_before_type_cast(attribute_name)
        read_attribute_before_type_cast(attribute_name)
      end
  end
end
Something went wrong with that request. Please try again.