module ActiveRecord::AttributeMethods
Active Record Attribute Methods¶ ↑
Constants
- AttrNames
- BLACKLISTED_CLASS_METHODS
Public Instance Methods
Returns the value of the attribute identified by attr_name
after it has been typecast (for example, “2004-12-12” in a date column is
cast to a date object, like Date.new(2004, 12, 12)). It raises
ActiveModel::MissingAttributeError if the identified attribute
is missing.
Note: :id is always present.
Alias for the read_attribute method.
class Person < ActiveRecord::Base belongs_to :organization end person = Person.new(name: 'Francesco', age: '22') person[:name] # => "Francesco" person[:age] # => 22 person = Person.select('id').first person[:name] # => ActiveModel::MissingAttributeError: missing attribute: name person[:organization_id] # => ActiveModel::MissingAttributeError: missing attribute: organization_id
# File lib/active_record/attribute_methods.rb, line 358 def [](attr_name) read_attribute(attr_name) { |n| missing_attribute(n, caller) } end
Updates the attribute identified by attr_name with the
specified value. (Alias for the protected
write_attribute method).
class Person < ActiveRecord::Base end person = Person.new person[:age] = '22' person[:age] # => 22 person[:age] # => Fixnum
# File lib/active_record/attribute_methods.rb, line 372 def []=(attr_name, value) write_attribute(attr_name, value) end
Returns an #inspect-like string for the value of the attribute
attr_name. String attributes are truncated up to 50
characters, Date and Time attributes are returned in the :db
format, Array attributes are truncated up to 10 values. Other attributes
return the value of #inspect without modification.
person = Person.create!(name: 'David Heinemeier Hansson ' * 3) person.attribute_for_inspect(:name) # => "\"David Heinemeier Hansson David Heinemeier Hansson ...\"" person.attribute_for_inspect(:created_at) # => "\"2012-10-22 00:15:07\"" person.attribute_for_inspect(:tag_ids) # => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]"
# File lib/active_record/attribute_methods.rb, line 304 def attribute_for_inspect(attr_name) value = read_attribute(attr_name) if value.is_a?(String) && value.length > 50 "#{value[0, 50]}...".inspect elsif value.is_a?(Date) || value.is_a?(Time) %Q("#{value.to_s(:db)}") elsif value.is_a?(Array) && value.size > 10 inspected = value.first(10).inspect %Q(#{inspected[0...-1]}, ...]) else value.inspect end end
Returns an array of names for the attributes available on this object.
class Person < ActiveRecord::Base end person = Person.new person.attribute_names # => ["id", "created_at", "updated_at", "name", "age"]
# File lib/active_record/attribute_methods.rb, line 271 def attribute_names @attributes.keys end
Returns true if the specified attribute has been
set by the user or by a database load and is neither nil nor
empty? (the latter only applies to objects that respond to
empty?, most notably Strings). Otherwise, false.
Note that it always returns true with boolean attributes.
class Task < ActiveRecord::Base end task = Task.new(title: '', is_done: false) task.attribute_present?(:title) # => false task.attribute_present?(:is_done) # => true task.title = 'Buy milk' task.is_done = true task.attribute_present?(:title) # => true task.attribute_present?(:is_done) # => true
# File lib/active_record/attribute_methods.rb, line 334 def attribute_present?(attribute) value = _read_attribute(attribute) !value.nil? && !(value.respond_to?(:empty?) && value.empty?) end
Returns a hash of all the attributes with their names as keys and the values of the attributes as values.
class Person < ActiveRecord::Base end person = Person.create(name: 'Francesco', age: 22) person.attributes # => {"id"=>3, "created_at"=>Sun, 21 Oct 2012 04:53:04, "updated_at"=>Sun, 21 Oct 2012 04:53:04, "name"=>"Francesco", "age"=>22}
# File lib/active_record/attribute_methods.rb, line 283 def attributes @attributes.to_hash end
Returns true if the given attribute is in the attributes hash,
otherwise false.
class Person < ActiveRecord::Base end person = Person.new person.has_attribute?(:name) # => true person.has_attribute?('age') # => true person.has_attribute?(:nothing) # => false
# File lib/active_record/attribute_methods.rb, line 259 def has_attribute?(attr_name) @attributes.key?(attr_name.to_s) end
A Person object with a name attribute can ask
person.respond_to?(:name),
person.respond_to?(:name=), and
person.respond_to?(:name?) which will all return
true. It also define the attribute methods if they have not
been generated.
class Person < ActiveRecord::Base end person = Person.new person.respond_to(:name) # => true person.respond_to(:name=) # => true person.respond_to(:name?) # => true person.respond_to('age') # => true person.respond_to('age=') # => true person.respond_to('age?') # => true person.respond_to(:nothing) # => false
# File lib/active_record/attribute_methods.rb, line 235 def respond_to?(name, include_private = false) return false unless super name = name.to_s # If the result is true then check for the select case. # For queries selecting a subset of columns, return false for unselected columns. # We check defined?(@attributes) not to issue warnings if called on objects that # have been allocated but not yet initialized. if defined?(@attributes) && self.class.column_names.include?(name) return has_attribute?(name) end return true end
Private Instance Methods
Returns a Hash of the Arel::Attributes and attribute values that have been typecasted for use in an Arel insert/update method.
# File lib/active_record/attribute_methods.rb, line 402 def arel_attributes_with_values(attribute_names) attrs = {} arel_table = self.class.arel_table attribute_names.each do |name| attrs[arel_table[name]] = typecasted_attribute_value(name) end attrs end
Filters out the primary keys, from the attribute names, when the primary key is to be generated (e.g. the id attribute has no value).
# File lib/active_record/attribute_methods.rb, line 421 def attributes_for_create(attribute_names) attribute_names.reject do |name| pk_attribute?(name) && id.nil? end end
Filters the primary keys and readonly attributes from the attribute names.
# File lib/active_record/attribute_methods.rb, line 413 def attributes_for_update(attribute_names) attribute_names.reject do |name| readonly_attribute?(name) end end
# File lib/active_record/attribute_methods.rb, line 431 def pk_attribute?(name) name == self.class.primary_key end
# File lib/active_record/attribute_methods.rb, line 427 def readonly_attribute?(name) self.class.readonly_attributes.include?(name) end
# File lib/active_record/attribute_methods.rb, line 435 def typecasted_attribute_value(name) _read_attribute(name) end