Spec-Zone.ru › Ruby on Rails 5.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::Serialization

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

Константы

AttrNames
BLACKLISTED_CLASS_METHODS

Открытые методы экземпляров

[](attr_name) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 346
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 всегда присутствует.

Псевдоним для метода 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
[]=(attr_name, value) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 360
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 393
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 295
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)}")
  else
    value.inspect
  end
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 263
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?(attribute) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 322
def attribute_present?(attribute)
  value = _read_attribute(attribute)
  !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 275
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 251
def has_attribute?(attr_name)
  @attributes.key?(attr_name.to_s)
end

Возвращает 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
respond_to?(name, include_private = false) Показать исходный код
# File activerecord/lib/active_record/attribute_methods.rb, line 219
def respond_to?(name, include_private = false)
  return false unless super

  case name
  when :to_partial_path
    name = "to_partial_path".freeze
  when :to_model
    name = "to_model".freeze
  else
    name = name.to_s
  end

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

  return 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–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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