Module: ActiveRecord::AttributeMethods::ClassMethods
- Defined in:
- lib/active_record/attribute_methods.rb
Instance Method Summary collapse
- #attribute_method?(attribute) ⇒ Boolean
- #attribute_methods_generated? ⇒ Boolean
-
#attribute_names ⇒ Object
Returns an array of column names as strings if it’s not an abstract class and table exists.
-
#dangerous_attribute_method?(name) ⇒ Boolean
A method name is ‘dangerous’ if it is already defined by Active Record, but not by any ancestors.
-
#define_attribute_methods ⇒ Object
Generates all the attribute related methods for columns in the database accessors, mutators and query methods.
-
#generated_external_attribute_methods ⇒ Object
We will define the methods as instance methods, but will call them as singleton methods.
- #instance_method_already_implemented?(method_name) ⇒ Boolean
- #method_defined_within?(name, klass, sup = klass.superclass) ⇒ Boolean
- #undefine_attribute_methods ⇒ Object
Instance Method Details
#attribute_method?(attribute) ⇒ Boolean
101 102 103 |
# File 'lib/active_record/attribute_methods.rb', line 101 def attribute_method?(attribute) super || (table_exists? && column_names.include?(attribute.to_s.sub(/=$/, ''))) end |
#attribute_methods_generated? ⇒ Boolean
52 53 54 |
# File 'lib/active_record/attribute_methods.rb', line 52 def attribute_methods_generated? @attribute_methods_generated ||= false end |
#attribute_names ⇒ Object
Returns an array of column names as strings if it’s not an abstract class and table exists. Otherwise it returns an empty array.
108 109 110 111 112 113 114 |
# File 'lib/active_record/attribute_methods.rb', line 108 def attribute_names @attribute_names ||= if !abstract_class? && table_exists? column_names else [] end end |
#dangerous_attribute_method?(name) ⇒ Boolean
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.)
85 86 87 |
# File 'lib/active_record/attribute_methods.rb', line 85 def dangerous_attribute_method?(name) method_defined_within?(name, Base) end |
#define_attribute_methods ⇒ Object
Generates all the attribute related methods for columns in the database accessors, mutators and query methods.
39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/active_record/attribute_methods.rb', line 39 def define_attribute_methods # Use a mutex; we don't want two thread simaltaneously trying to define # attribute methods. @attribute_methods_mutex ||= Mutex.new @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 |
#generated_external_attribute_methods ⇒ Object
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).
60 61 62 |
# File 'lib/active_record/attribute_methods.rb', line 60 def generated_external_attribute_methods @generated_external_attribute_methods ||= Module.new { extend self } end |
#instance_method_already_implemented?(method_name) ⇒ Boolean
69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/active_record/attribute_methods.rb', line 69 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 |
#method_defined_within?(name, klass, sup = klass.superclass) ⇒ Boolean
89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/active_record/attribute_methods.rb', line 89 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 |
#undefine_attribute_methods ⇒ Object
64 65 66 67 |
# File 'lib/active_record/attribute_methods.rb', line 64 def undefine_attribute_methods super @attribute_methods_generated = false end |