# 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.

    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 344
    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].class # => Integer

    # File lib/active_record/attribute_methods.rb, line 358
    def []=(attr_name, value)
      write_attribute(attr_name, value)
    end

accessed_fields() click to toggle source

Returns the name of all database fields which have been read from this model. This can be useful in development mode to determine which fields need to be selected. For performance critical pages, selecting only the required fields can be an easy performance win (assuming you aren't using all of the fields on the model).

For example:

    class PostsController < ActionController::Base
      after_action :print_accessed_fields, only: :index

      def index
        @posts = Post.all
      end

      private

      def print_accessed_fields
        p @posts.first.accessed_fields
      end
    end

Which allows you to quickly change your code to:

    class PostsController < ActionController::Base
      def index
        @posts = Post.select(:id, :title, :author_id, :updated_at)
      end
    end

    # File lib/active_record/attribute_methods.rb, line 391
    def accessed_fields
      @attributes.accessed
    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. 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, 11]"

    # File lib/active_record/attribute_methods.rb, line 295
    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)}")
      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 263
    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 322
    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 275
    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 251
    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 defines 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 219
    def respond_to?(name, include_private = false)
      return false unless super

      case name
      when :to_partial_path
        name = "to_partial_path".freeze
      when :to_model
        name = "to_model".freeze
      else
        name = name.to_s
      end

      # 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 414
    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

arel_attributes_with_values_for_create(attribute_names) click to toggle source

    # File lib/active_record/attribute_methods.rb, line 404
    def arel_attributes_with_values_for_create(attribute_names)
      arel_attributes_with_values(attributes_for_create(attribute_names))
    end

arel_attributes_with_values_for_update(attribute_names) click to toggle source

    # File lib/active_record/attribute_methods.rb, line 408
    def arel_attributes_with_values_for_update(attribute_names)
      arel_attributes_with_values(attributes_for_update(attribute_names))
    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 433
    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 425
    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 443
    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 439
    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 447
    def typecasted_attribute_value(name)
      _read_attribute(name)
    end