Module: ActiveRecord::AttributeMethods::ClassMethods
- Defined in:
- activerecord/lib/active_record/attribute_methods.rb
Instance Method Summary collapse
-
#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.
-
#column_for_attribute(name) ⇒ Object
Returns the column object for the named attribute.
-
#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
#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
140 141 142 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 140 def attribute_method?(attribute) super || (table_exists? && column_names.include?(attribute.to_s.sub(/=$/, ""))) 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"]
152 153 154 155 156 157 158 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 152 def attribute_names @attribute_names ||= if !abstract_class? && table_exists? attribute_types.keys else [] end end |
#column_for_attribute(name) ⇒ Object
Returns the column object for the named attribute. Returns a ActiveRecord::ConnectionAdapters::NullColumn
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)
# => #<ActiveRecord::ConnectionAdapters::NullColumn:0xXXX @name=nil, @sql_type=nil, @cast_type=#<Type::Value>, ...>
185 186 187 188 189 190 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 185 def column_for_attribute(name) name = name.to_s columns_hash.fetch(name) do ConnectionAdapters::NullColumn.new(name) end 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.)
99 100 101 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 99 def dangerous_attribute_method?(name) # :nodoc: method_defined_within?(name, Base) 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.)
117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 117 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.
48 49 50 51 52 53 54 55 56 57 58 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 48 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
end
Person.has_attribute?('name') # => true
Person.has_attribute?(:age) # => true
Person.has_attribute?(:nothing) # => false
168 169 170 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 168 def has_attribute?(attr_name) attribute_types.key?(attr_name.to_s) end |
#inherited(child_class) ⇒ Object
:nodoc:
32 33 34 35 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 32 def inherited(child_class) #:nodoc: child_class.initialize_generated_modules super end |
#initialize_generated_modules ⇒ Object
:nodoc:
37 38 39 40 41 42 43 44 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 37 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
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 81 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 |
#method_defined_within?(name, klass, superklass = klass.superclass) ⇒ Boolean
:nodoc:
103 104 105 106 107 108 109 110 111 112 113 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 103 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:
60 61 62 63 64 65 |
# File 'activerecord/lib/active_record/attribute_methods.rb', line 60 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 |