module ActiveRecord::AttributeMethods::ClassMethods

Public Instance Methods

attribute_method?(attribute) Show source
# 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
attribute_names() Show source
# 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"]
class_method_defined_within?(name, klass, superklass = klass.superclass) Show source
# 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
column_for_attribute(name) Show source
# 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
dangerous_class_method?(method_name) Show source
# 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.)

instance_method_already_implemented?(method_name) Show source
# 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.