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.