модуль ActiveRecord::AttributeMethods
Методы атрибутов Active Record
Константы
- RESTRICTED_CLASS_METHODS
Публичные методы экземпляров
# File activerecord/lib/active_record/attribute_methods.rb, line 412
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
# File activerecord/lib/active_record/attribute_methods.rb, line 425 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)
# File activerecord/lib/active_record/attribute_methods.rb, line 457 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
# File activerecord/lib/active_record/attribute_methods.rb, line 362 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]"
# File activerecord/lib/active_record/attribute_methods.rb, line 331 def attribute_names @attributes.keys end
Возвращает массив имён доступных атрибутов этого объекта.
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 384 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
# File activerecord/lib/active_record/attribute_methods.rb, line 343 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}
# File activerecord/lib/active_record/attribute_methods.rb, line 313 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
# File activerecord/lib/active_record/attribute_methods.rb, line 286
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–2021 David Heinemeier Hansson
Licensed under the MIT License.