Methods
- A
- D
- G
- I
- M
- U
Instance Public methods
Returns an array of column names as strings if it’s not an abstract class and table exists. Otherwise it returns an empty array.
A method name is ‘dangerous’ if it is already defined by Active Record, but not by any ancestors. (So ‘puts’ is not dangerous but ‘save’ is.)
Generates all the attribute related methods for columns in the database accessors, mutators and query methods.
# File activerecord/lib/active_record/attribute_methods.rb, line 38 def define_attribute_methods # Use a mutex; we don't want two thread simaltaneously trying to define # attribute methods. @attribute_methods_mutex.synchronize do return if attribute_methods_generated? superclass.define_attribute_methods unless self == base_class super(column_names) @attribute_methods_generated = true end end
We will define the methods as instance methods, but will call them as singleton methods. This allows us to use method_defined? to check if the method exists, which is fast and won’t give any false positives from the ancestors (because there are no ancestors).
# File activerecord/lib/active_record/attribute_methods.rb, line 66 def instance_method_already_implemented?(method_name) if dangerous_attribute_method?(method_name) raise DangerousAttributeError, "#{method_name} is defined by ActiveRecord" end if superclass == Base super else # If B < A and A defines its own attribute method, then we don't want to overwrite that. defined = method_defined_within?(method_name, superclass, superclass.generated_attribute_methods) defined && !ActiveRecord::Base.method_defined?(method_name) || super end end
# File activerecord/lib/active_record/attribute_methods.rb, line 86 def method_defined_within?(name, klass, sup = klass.superclass) if klass.method_defined?(name) || klass.private_method_defined?(name) if sup.method_defined?(name) || sup.private_method_defined?(name) klass.instance_method(name).owner != sup.instance_method(name).owner else true end else false end end