модуль ActiveRecord::AttributeMethods
Методы атрибутов Active Record
Константы
- AttrNames
- BLACKLISTED_CLASS_METHODS
Открытые методы экземпляров
# 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
# 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
# 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
# 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]"
# 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"]
# 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
# 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}
# 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
# 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
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.