Spec-Zone.ru › Ruby on Rails 6.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::Dirty, ActiveRecord::AttributeMethods::Serialization

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

Константы

RESTRICTED_CLASS_METHODS

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

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

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

Примечание: :id всегда присутствует.

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
[]=(attr_name, value) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 344
def []=(attr_name, value)
  write_attribute(attr_name, value)
end

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

class Person < ActiveRecord::Base
end

person = Person.new
person[:age] = '22'
person[:age] # => 22
person[:age].class # => Integer
accessed_fields() Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 377
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 284
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 символов, атрибуты Date и Time возвращаются в формате :db. Другие атрибуты возвращают значение #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, 11]"
attribute_names() Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 252
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 306
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 264
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 234
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 207
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.
  # We check defined?(@attributes) not to issue warnings if called on objects that
  # have been allocated but not yet initialized.
  if defined?(@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–2020 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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