Spec-Zone.ru › Ruby on Rails 7.2

модуль 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 414
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 427
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 459
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 364
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 333
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 386
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 345
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 315
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 290
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