module ActiveRecord::AttributeMethods::ClassMethods
Public Instance Methods
# File activerecord/lib/active_record/attribute_methods.rb, line 174 def attribute_method?(attribute) super || (table_exists? && column_names.include?(attribute.to_s.sub(/=$/, ''))) end
Returns true if attribute is an attribute method and table exists, false otherwise.
class Person < ActiveRecord::Base
end
Person.attribute_method?('name')   # => true
Person.attribute_method?(:age=)    # => true
Person.attribute_method?(:nothing) # => false
  Calls superclass method 
  # File activerecord/lib/active_record/attribute_methods.rb, line 186
def attribute_names
  @attribute_names ||= if !abstract_class? && table_exists?
      column_names
    else
      []
    end
end Returns an array of column names as strings if it's not an abstract class and table exists. Otherwise it returns an empty array.
class Person < ActiveRecord::Base end Person.attribute_names # => ["id", "created_at", "updated_at", "name", "age"]
# File activerecord/lib/active_record/attribute_methods.rb, line 153
def class_method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc
  if klass.respond_to?(name, true)
    if superklass.respond_to?(name, true)
      klass.method(name).owner != superklass.method(name).owner
    else
      true
    end
  else
    false
  end
end # File activerecord/lib/active_record/attribute_methods.rb, line 206
      def column_for_attribute(name)
        column = columns_hash[name.to_s]
        if column.nil?
          ActiveSupport::Deprecation.warn("            `#column_for_attribute` will return a null object for non-existent
            columns in Rails 5. Use `#has_attribute?` if you need to check for
            an attribute's existence.
".squish)
        end
        column
      end Returns the column object for the named attribute. Returns nil if the named attribute does not exist.
class Person < ActiveRecord::Base end person = Person.new person.column_for_attribute(:name) # the result depends on the ConnectionAdapter # => #<ActiveRecord::ConnectionAdapters::Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...> person.column_for_attribute(:nothing) # => nil
# File activerecord/lib/active_record/attribute_methods.rb, line 149 def dangerous_class_method?(method_name) BLACKLISTED_CLASS_METHODS.include?(method_name.to_s) || class_method_defined_within?(method_name, Base) end
A class method is 'dangerous' if it is already (re)defined by Active Record, but not by any ancestors. (So 'puts' is not dangerous but 'new' is.)
# File activerecord/lib/active_record/attribute_methods.rb, line 113
def instance_method_already_implemented?(method_name)
  if dangerous_attribute_method?(method_name)
    raise DangerousAttributeError, "#{method_name} is defined by Active Record. Check to make sure that you don't have an attribute or method with the same name."
  end
  if superclass == Base
    super
  else
    # If ThisClass < ... < SomeSuperClass < ... < Base and SomeSuperClass
    # defines its own attribute method, then we don't want to overwrite that.
    defined = method_defined_within?(method_name, superclass, Base) &&
      ! superclass.instance_method(method_name).owner.is_a?(GeneratedAttributeMethods)
    defined || super
  end
end Raises a ActiveRecord::DangerousAttributeError exception when an Active Record method is defined in the model, otherwise false.
class Person < ActiveRecord::Base
  def save
    'already defined by Active Record'
  end
end
Person.instance_method_already_implemented?(:save)
# => ActiveRecord::DangerousAttributeError: save is defined by ActiveRecord
Person.instance_method_already_implemented?(:name)
# => false
  Calls superclass method 
  
    © 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.