Module: ActiveRecord::AttributeMethods::ClassMethods
- Defined in:
- lib/active_record/attribute_methods.rb
Instance Method Summary collapse
-
#_has_attribute?(attr_name) ⇒ Boolean
:nodoc:.
-
#attribute_method?(attribute) ⇒ Boolean
Returns
true
ifattribute
is an attribute method and table exists,false
otherwise. -
#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 (re)defined by Active Record, but not by any ancestors.
-
#dangerous_class_method?(method_name) ⇒ Boolean
A class method is ‘dangerous’ if it is already (re)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.
-
#has_attribute?(attr_name) ⇒ Boolean
Returns true if the given attribute exists, otherwise false.
-
#inherited(child_class) ⇒ Object
:nodoc:.
-
#initialize_generated_modules ⇒ Object
:nodoc:.
-
#instance_method_already_implemented?(method_name) ⇒ Boolean
Raises an ActiveRecord::DangerousAttributeError exception when an Active Record method is defined in the model, otherwise
false
. -
#method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:.
-
#undefine_attribute_methods ⇒ Object
:nodoc:.
Instance Method Details
#_has_attribute?(attr_name) ⇒ Boolean
:nodoc:
186 187 188 |
# File 'lib/active_record/attribute_methods.rb', line 186 def _has_attribute?(attr_name) # :nodoc: attribute_types.key?(attr_name) end |
#attribute_method?(attribute) ⇒ Boolean
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
150 151 152 |
# File 'lib/active_record/attribute_methods.rb', line 150 def attribute_method?(attribute) super || (table_exists? && column_names.include?(attribute.to_s.delete_suffix("="))) 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.
class Person < ActiveRecord::Base
end
Person.attribute_names
# => ["id", "created_at", "updated_at", "name", "age"]
162 163 164 165 166 167 168 |
# File 'lib/active_record/attribute_methods.rb', line 162 def attribute_names @attribute_names ||= if !abstract_class? && table_exists? attribute_types.keys else [] end.freeze end |
#dangerous_attribute_method?(name) ⇒ Boolean
A method name is ‘dangerous’ if it is already (re)defined by Active Record, but not by any ancestors. (So ‘puts’ is not dangerous but ‘save’ is.)
109 110 111 |
# File 'lib/active_record/attribute_methods.rb', line 109 def dangerous_attribute_method?(name) # :nodoc: ::ActiveRecord::AttributeMethods.dangerous_attribute_methods.include?(name.to_s) end |
#dangerous_class_method?(method_name) ⇒ Boolean
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.)
127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/active_record/attribute_methods.rb', line 127 def dangerous_class_method?(method_name) return true if RESTRICTED_CLASS_METHODS.include?(method_name.to_s) if Base.respond_to?(method_name, true) if Object.respond_to?(method_name, true) Base.method(method_name).owner != Object.method(method_name).owner else true end else false end end |
#define_attribute_methods ⇒ Object
Generates all the attribute related methods for columns in the database accessors, mutators and query methods.
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/active_record/attribute_methods.rb', line 58 def define_attribute_methods # :nodoc: return false if @attribute_methods_generated # Use a mutex; we don't want two threads simultaneously trying to define # attribute methods. generated_attribute_methods.synchronize do return false if @attribute_methods_generated superclass.define_attribute_methods unless base_class? super(attribute_names) @attribute_methods_generated = true end end |
#has_attribute?(attr_name) ⇒ Boolean
Returns true if the given attribute exists, otherwise false.
class Person < ActiveRecord::Base
alias_attribute :new_name, :name
end
Person.has_attribute?('name') # => true
Person.has_attribute?('new_name') # => true
Person.has_attribute?(:age) # => true
Person.has_attribute?(:nothing) # => false
180 181 182 183 184 |
# File 'lib/active_record/attribute_methods.rb', line 180 def has_attribute?(attr_name) attr_name = attr_name.to_s attr_name = attribute_aliases[attr_name] || attr_name attribute_types.key?(attr_name) end |
#inherited(child_class) ⇒ Object
:nodoc:
42 43 44 45 |
# File 'lib/active_record/attribute_methods.rb', line 42 def inherited(child_class) # :nodoc: child_class.initialize_generated_modules super end |
#initialize_generated_modules ⇒ Object
:nodoc:
47 48 49 50 51 52 53 54 |
# File 'lib/active_record/attribute_methods.rb', line 47 def initialize_generated_modules # :nodoc: @generated_attribute_methods = const_set(:GeneratedAttributeMethods, GeneratedAttributeMethods.new) private_constant :GeneratedAttributeMethods @attribute_methods_generated = false include @generated_attribute_methods super end |
#instance_method_already_implemented?(method_name) ⇒ Boolean
Raises an 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 Active Record. Check to make sure that you don't have an attribute or method with the same name.
Person.instance_method_already_implemented?(:name)
# => false
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/active_record/attribute_methods.rb', line 91 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 override that. defined = method_defined_within?(method_name, superclass, Base) && ! superclass.instance_method(method_name).owner.is_a?(GeneratedAttributeMethods) defined || super end end |
#method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:
113 114 115 116 117 118 119 120 121 122 123 |
# File 'lib/active_record/attribute_methods.rb', line 113 def method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc: if klass.method_defined?(name) || klass.private_method_defined?(name) if superklass.method_defined?(name) || superklass.private_method_defined?(name) klass.instance_method(name).owner != superklass.instance_method(name).owner else true end else false end end |
#undefine_attribute_methods ⇒ Object
:nodoc:
70 71 72 73 74 75 |
# File 'lib/active_record/attribute_methods.rb', line 70 def undefine_attribute_methods # :nodoc: generated_attribute_methods.synchronize do super if defined?(@attribute_methods_generated) && @attribute_methods_generated @attribute_methods_generated = false end end |