123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::AttributeMethods::Query

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activerecord/lib/active_record/attribute_methods/query.rb

Overview

Adds query methods for attributes that return either true or false depending on the attribute type and value.

For Boolean attributes this will return true if the value is present and return false otherwise:

class Product < ActiveRecord::Base
end

product = Product.new(archived: false)
product.archived? # => false
product.archived = true
product.archived? # => true

For Numeric attributes this will return true if the value is a non-zero number and return false otherwise:

product.inventory_count = 0
product.inventory_count? # => false
product.inventory_count = 1
product.inventory_count? # => true

For other attributes it will return true if the value is present and return false otherwise:

product.name = nil
product.name? # => false
product.name = " "
product.name? # => false
product.name = "Orange"
product.name? # => true

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Method Summary

DSL Calls

included

[ GitHub ]


41
42
43
# File 'activerecord/lib/active_record/attribute_methods/query.rb', line 41

included do
  attribute_method_suffix "?", parameters: false
end

Instance Method Details

#_query_attribute(attr_name)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/query.rb', line 53

def _query_attribute(attr_name) # :nodoc:
  value = self._read_attribute(attr_name.to_s)

  query_cast_attribute(attr_name, value)
end

#attribute?(attr_name) (private)

Alias for #query_attribute.

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/query.rb', line 59

alias :attribute? :query_attribute

#query_attribute(attr_name) Also known as: #attribute?

Returns true or false for the attribute identified by attr_name, depending on the attribute type and value.

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/query.rb', line 47

def query_attribute(attr_name)
  value = self.public_send(attr_name)

  query_cast_attribute(attr_name, value)
end

#query_cast_attribute(attr_name, value) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/query.rb', line 63

def query_cast_attribute(attr_name, value)
  case value
  when true        then true
  when false, nil  then false
  else
    if !type_for_attribute(attr_name) { false }
      if Numeric === value || !value.match?(/[^0-9]/)
        !value.to_i.zero?
      else
        return false if ActiveModel::Type::Boolean::FALSE_VALUES.include?(value)
        !value.blank?
      end
    elsif value.respond_to?(:zero?)
      !value.zero?
    else
      !value.blank?
    end
  end
end