module ActiveRecord::AttributeMethods - activerecord-4.2.3 Documentation

# module ActiveRecord::AttributeMethods

# Active Record Attribute Methods¶ ↑

### Constants

AttrNames
BLACKLISTED_CLASS_METHODS

### Public Instance Methods

[](attr_name) click to toggle source

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

[]=(attr_name, value) click to toggle source

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

attribute_for_inspect(attr_name) click to toggle source

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

attribute_names() click to toggle source

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

attribute_present?(attribute) click to toggle source

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

attributes() click to toggle source

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

has_attribute?(attr_name) click to toggle source

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

respond_to?(name, include_private = false) click to toggle source

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

Calls superclass method

    # 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

arel_attributes_with_values(attribute_names) click to toggle source

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

attributes_for_create(attribute_names) click to toggle source

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

attributes_for_update(attribute_names) click to toggle source

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

pk_attribute?(name) click to toggle source

    # File lib/active_record/attribute_methods.rb, line 431
    def pk_attribute?(name)
      name == self.class.primary_key
    end

readonly_attribute?(name) click to toggle source

    # File lib/active_record/attribute_methods.rb, line 427
    def readonly_attribute?(name)
      self.class.readonly_attributes.include?(name)
    end

typecasted_attribute_value(name) click to toggle source

    # File lib/active_record/attribute_methods.rb, line 435
    def typecasted_attribute_value(name)
      _read_attribute(name)
    end