модуль ActiveRecord::AttributeMethods
Методы атрибутов Active Record
Константы
- AttrNames
- BLACKLISTED_CLASS_METHODS
Публичные методы экземпляров
# File activerecord/lib/active_record/attribute_methods.rb, line 354
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 368 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 303
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 271 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 330 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 283 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 259 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 235
def respond_to?(name, include_private = false)
return false unless super
name = name.to_s
# 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.