Spec-Zone.ru › Ruby on Rails 8.0

модуль ActiveRecord::AttributeMethods

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

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

Константы

RESTRICTED_CLASS_METHODS

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

[](attr_name) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 415
def [](attr_name)
  read_attribute(attr_name) { |n| missing_attribute(n, caller) }
end

Возвращает значение атрибута, идентифицируемого по attr_name, после применения преобразования типов. (Дополнительную информацию о поведении преобразования типов см. в типах по адресу ActiveModel::Type.)

class Person < ActiveRecord::Base
  belongs_to :organization
end

person = Person.new(name: "Francesco", date_of_birth: "2004-12-12")
person[:name]            # => "Francesco"
person[:date_of_birth]   # => Date.new(2004, 12, 12)
person[:organization_id] # => nil

Вызывает исключение ActiveModel::MissingAttributeError, если атрибут отсутствует. Однако обратите внимание, что атрибут id никогда не считается отсутствующим.

person = Person.select(:name).first
person[:name]            # => "Francesco"
person[:date_of_birth]   # => ActiveModel::MissingAttributeError: missing attribute 'date_of_birth' for Person
person[:organization_id] # => ActiveModel::MissingAttributeError: missing attribute 'organization_id' for Person
person[:id]              # => nil
[]=(attr_name, value) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 428
def []=(attr_name, value)
  write_attribute(attr_name, value)
end

Обновляет атрибут, идентифицируемый по attr_name, с использованием указанного value. Значение атрибута будет преобразовано в тип при чтении.

class Person < ActiveRecord::Base
end

person = Person.new
person[:date_of_birth] = "2004-12-12"
person[:date_of_birth] # => Date.new(2004, 12, 12)
accessed_fields() Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 460
def accessed_fields
  @attributes.accessed
end

Возвращает имена всех полей базы данных, которые были считаны из этой модели. Это может быть полезно в режиме разработки, чтобы определить, какие поля необходимо выбрать. Для критически важных для производительности страниц выбор только необходимых полей может обеспечить значительное улучшение производительности (в предположении, что вы не используете все поля модели).

Например:

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

Что позволяет быстро изменить ваш код на:

class PostsController < ActionController::Base
  def index
    @posts = Post.select(:id, :title, :author_id, :updated_at)
  end
end
attribute_for_inspect(attr_name) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 365
def attribute_for_inspect(attr_name)
  attr_name = attr_name.to_s
  attr_name = self.class.attribute_aliases[attr_name] || attr_name
  value = _read_attribute(attr_name)
  format_for_inspect(attr_name, value)
end

Возвращает строку в формате, похожем на #inspect, для значения атрибута attr_name. String атрибуты усекаются до 50 символов. Другие атрибуты возвращают значение #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.000000000 +0000\""

person.attribute_for_inspect(:tag_ids)
# => "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]"
attribute_names() Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 334
def attribute_names
  @attributes.keys
end

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

class Person < ActiveRecord::Base
end

person = Person.new
person.attribute_names
# => ["id", "created_at", "updated_at", "name", "age"]
attribute_present?(attr_name) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 387
def attribute_present?(attr_name)
  attr_name = attr_name.to_s
  attr_name = self.class.attribute_aliases[attr_name] || attr_name
  value = _read_attribute(attr_name)
  !value.nil? && !(value.respond_to?(:empty?) && value.empty?)
end

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

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
attributes() Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 346
def attributes
  @attributes.to_hash
end

Возвращает хеш всех атрибутов с их именами в качестве ключей и значениями атрибутов.

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}
has_attribute?(attr_name) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 316
def has_attribute?(attr_name)
  attr_name = attr_name.to_s
  attr_name = self.class.attribute_aliases[attr_name] || attr_name
  @attributes.key?(attr_name)
end

Возвращает true, если указанный атрибут присутствует в хеше атрибутов, иначе false.

class Person < ActiveRecord::Base
  alias_attribute :new_name, :name
end

person = Person.new
person.has_attribute?(:name)     # => true
person.has_attribute?(:new_name) # => true
person.has_attribute?('age')     # => true
person.has_attribute?(:nothing)  # => false
respond_to?(name, include_private = false) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 291
def respond_to?(name, include_private = false)
  return false unless super

  # If the result is true then check for the select case.
  # For queries selecting a subset of columns, return false for unselected columns.
  if @attributes
    if name = self.class.symbol_column_to_string(name.to_sym)
      return _has_attribute?(name)
    end
  end

  true
end

Объект 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?

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

Spec-Zone.ru

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