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.