Spec-Zone.ru › Ruby on Rails 4.1

модуль ActiveRecord::AttributeMethods

Включенные модули:
ActiveModel::AttributeMethods, ActiveRecord::AttributeMethods::Read, ActiveRecord::AttributeMethods::Write, ActiveRecord::AttributeMethods::BeforeTypeCast, ActiveRecord::AttributeMethods::Query, ActiveRecord::AttributeMethods::PrimaryKey, ActiveRecord::AttributeMethods::TimeZoneConversion, ActiveRecord::AttributeMethods::Serialization

Методы атрибутов Active Record

Константы

AttrNames
BLACKLISTED_CLASS_METHODS

Публичные методы экземпляров

[](attr_name) Показать исходный код

Возвращает значение атрибута, идентифицированного по attr_name, после приведения типов (например, «2004-12-12» в столбце даты приводится к объекту даты, как Date.new(2004, 12, 12)). Возникает ActiveModel::MissingAttributeError, если идентифицированный атрибут отсутствует.

Псевдоним для метода read_attribute.

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 activerecord/lib/active_record/attribute_methods.rb, line 382
def [](attr_name)
  read_attribute(attr_name) { |n| missing_attribute(n, caller) }
end
[]=(attr_name, value) Показать исходный код

Обновляет атрибут, идентифицированный по attr_name, указанным value. (Псевдоним для защищенного метода write_attribute).

class Person < ActiveRecord::Base
end

person = Person.new
person[:age] = '22'
person[:age] # => 22
person[:age] # => Fixnum
# File activerecord/lib/active_record/attribute_methods.rb, line 396
def []=(attr_name, value)
  write_attribute(attr_name, value)
end
attribute_for_inspect(attr_name) Показать исходный код

Возвращает строку, похожую на #inspect, для значения атрибута attr_name. Атрибуты типа String обрезаются до 50 символов, атрибуты типа Date и Time возвращаются в формате :db, атрибуты типа Array обрезаются до 10 значений. Другие атрибуты возвращают значение #inspect без изменений.

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 activerecord/lib/active_record/attribute_methods.rb, line 313
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() Показать исходный код

Возвращает массив имён доступных атрибутов для этого объекта.

class Person < ActiveRecord::Base
end

person = Person.new
person.attribute_names
# => ["id", "created_at", "updated_at", "name", "age"]
# File activerecord/lib/active_record/attribute_methods.rb, line 273
def attribute_names
  @attributes.keys
end
attribute_present?(attribute) Показать исходный код

Возвращает true, если указанный attribute был задан пользователем или загружен из базы данных и не является nil или empty? (последнее относится только к объектам, которые отвечают на empty?, в первую очередь к строкам). В противном случае, false. Обратите внимание, что для булевых атрибутов всегда возвращается true.

class Task < ActiveRecord::Base
end

person = Task.new(title: '', is_done: false)
person.attribute_present?(:title)   # => false
person.attribute_present?(:is_done) # => true
person.name = 'Francesco'
person.is_done = true
person.attribute_present?(:title)   # => true
person.attribute_present?(:is_done) # => true
# File activerecord/lib/active_record/attribute_methods.rb, line 343
def attribute_present?(attribute)
  value = read_attribute(attribute)
  !value.nil? && !(value.respond_to?(:empty?) && value.empty?)
end
attributes() Показать исходный код

Возвращает словарь всех атрибутов, где ключами являются имена атрибутов, а значениями — значения атрибутов.

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 activerecord/lib/active_record/attribute_methods.rb, line 285
def attributes
  attribute_names.each_with_object({}) { |name, attrs|
    attrs[name] = read_attribute(name)
  }
end
column_for_attribute(name) Показать исходный код

Возвращает объект столбца для указанного атрибута. Возвращает nil, если атрибут не существует.

class Person < ActiveRecord::Base
end

person = Person.new
person.column_for_attribute(:name) # the result depends on the ConnectionAdapter
# => #<ActiveRecord::ConnectionAdapters::SQLite3Column:0x007ff4ab083980 @name="name", @sql_type="varchar(255)", @null=true, ...>

person.column_for_attribute(:nothing)
# => nil
# File activerecord/lib/active_record/attribute_methods.rb, line 360
def column_for_attribute(name)
  # FIXME: should this return a null object for columns that don't exist?
  self.class.columns_hash[name.to_s]
end
has_attribute?(attr_name) Показать исходный код

Возвращает true, если заданный атрибут есть в словаре атрибутов, иначе 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 activerecord/lib/active_record/attribute_methods.rb, line 261
def has_attribute?(attr_name)
  @attributes.has_key?(attr_name.to_s)
end
respond_to?(name, include_private = false) Показать исходный код

Объект Person с атрибутом name может использовать person.respond_to?(:name), person.respond_to?(:name=), и person.respond_to?(:name?), которые все вернут true. Также определяет методы атрибутов, если они не были сгенерированы.

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
Вызов метода родительского класса ActiveModel::AttributeMethods#respond_to?
# File activerecord/lib/active_record/attribute_methods.rb, line 233
def respond_to?(name, include_private = false)
  name = name.to_s
  self.class.define_attribute_methods
  result = super

  # If the result is false the answer is false.
  return false unless result

  # 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) && @attributes.any? && self.class.column_names.include?(name)
    return has_attribute?(name)
  end

  return true
end

© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API