модуль ActiveRecord::Persistence::ClassMethods
Публичные методы экземпляра
# File activerecord/lib/active_record/persistence.rb, line 82
def build(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| build(attr, &block) }
else
new(attributes, &block)
end
end Создаёт объект (или несколько объектов) и возвращает созданный объект либо список созданных объектов.
Параметр attributes может быть экземпляром Hash или Array из хешей. Эти хеши описывают атрибуты объектов, которые необходимо создать.
Примеры
# Build a single new object
User.build(first_name: 'Jamie')
# Build an Array of new objects
User.build([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
# Build a single object and pass it into a block to set other attributes.
User.build(first_name: 'Jamie') do |u|
u.is_admin = false
end
# Building an Array of new objects using a block, where the block is executed for each object:
User.build([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }]) do |u|
u.is_admin = false
end
# File activerecord/lib/active_record/persistence.rb, line 33
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes, &block)
object.save
object
end
end Создаёт объект (или несколько объектов) и сохраняет его в базу данных, если проверки пройдены. Возвращается созданный объект независимо от того, удалось ли успешно сохранить его в базу данных.
Параметр attributes может быть экземпляром Hash или Array из хешей. Эти хеши описывают атрибуты объектов, которые необходимо создать.
Примеры
# Create a single new object
User.create(first_name: 'Jamie')
# Create an Array of new objects
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }])
# Create a single object and pass it into a block to set other attributes.
User.create(first_name: 'Jamie') do |u|
u.is_admin = false
end
# Creating an Array of new objects using a block, where the block is executed for each object:
User.create([{ first_name: 'Jamie' }, { first_name: 'Jeremy' }]) do |u|
u.is_admin = false
end
# File activerecord/lib/active_record/persistence.rb, line 50
def create!(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create!(attr, &block) }
else
object = new(attributes, &block)
object.save!
object
end
end Создаёт объект (или несколько объектов) и сохраняет его в базу данных, если проверки пройдены. В отличие от Base#create, при неудачном прохождении проверок вызывает ошибку RecordInvalid.
Параметр attributes может быть экземпляром Hash или Array из хешей. Он описывает атрибуты, которые необходимо создать у объекта, или у нескольких объектов, если передан Array из хешей.
# File activerecord/lib/active_record/persistence.rb, line 100
def instantiate(attributes, column_types = {}, &block)
klass = discriminate_class_for_record(attributes)
instantiate_instance_of(klass, attributes, column_types, &block)
end Получив хеш атрибутов, instantiate возвращает новый экземпляр соответствующего класса. Принимает только строки в качестве ключей.
Например, Post.all может возвращать комментарии, сообщения и электронные письма, сохраняя подкласс записи в атрибуте type. Вызывая instantiate вместо new, методы поиска гарантируют, что для каждой записи будут созданы новые экземпляры соответствующего класса.
О том, как реализовано это сопоставление наследования «одна таблица», см. в ActiveRecord::Inheritance#discriminate_class_for_record.
# File activerecord/lib/active_record/persistence.rb, line 212 def query_constraints(*columns_list) raise ArgumentError, "You must specify at least one column to be used in querying" if columns_list.empty? @query_constraints_list = columns_list.map(&:to_s) @has_query_constraints = @query_constraints_list end
Принимает список имён атрибутов, которые будут использоваться в предложении WHERE запросов SELECT / UPDATE / DELETE и в предложении ORDER BY методов поиска первой и последней записи.
class Developer < ActiveRecord::Base query_constraints :company_id, :id end developer = Developer.first # SELECT "developers".* FROM "developers" ORDER BY "developers"."company_id" ASC, "developers"."id" ASC LIMIT 1 developer.inspect # => #<Developer id: 1, company_id: 1, ...> developer.update!(name: "Nikita") # UPDATE "developers" SET "name" = 'Nikita' WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 # It is possible to update an attribute used in the query_constraints clause: developer.update!(company_id: 2) # UPDATE "developers" SET "company_id" = 2 WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 developer.name = "Bob" developer.save! # UPDATE "developers" SET "name" = 'Bob' WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 developer.destroy! # DELETE FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 developer.delete # DELETE FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 developer.reload # SELECT "developers".* FROM "developers" WHERE "developers"."company_id" = 1 AND "developers"."id" = 1 LIMIT 1
# File activerecord/lib/active_record/persistence.rb, line 132
def update(id = :all, attributes)
if id.is_a?(Array)
if id.any?(ActiveRecord::Base)
raise ArgumentError,
"You are passing an array of ActiveRecord::Base instances to `update`. " \
"Please pass the ids of the objects by calling `pluck(:id)` or `map(&:id)`."
end
id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
object.update(attributes[idx])
}
elsif id == :all
all.each { |record| record.update(attributes) }
else
if ActiveRecord::Base === id
raise ArgumentError,
"You are passing an instance of ActiveRecord::Base to `update`. " \
"Please pass the id of the object by calling `.id`."
end
object = find(id)
object.update(attributes)
object
end
end Обновляет объект (или несколько объектов) и сохраняет его в базу данных, если проверки пройдены. Возвращается обновлённый объект независимо от того, удалось ли успешно сохранить его в базу данных.
Параметры
-
id— это должен быть идентификатор или массив идентификаторов для обновления. Необязательный аргумент; по умолчанию обновляются все записи в отношении. -
attributes— это должен быть хеш атрибутов или массив хешей.
Примеры
# Updates one record
Person.update(15, user_name: "Samuel", group: "expert")
# Updates multiple records
people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } }
Person.update(people.keys, people.values)
# Updates multiple records from the result of a relation
people = Person.where(group: "expert")
people.update(group: "masters")
Примечание: обновление большого числа записей приводит к выполнению запроса UPDATE для каждой записи, что может вызвать проблемы с производительностью. Если для обновления каждой записи не требуется запускать обратные вызовы, рекомендуется использовать update_all, чтобы обновить все записи одним запросом.
# File activerecord/lib/active_record/persistence.rb, line 158
def update!(id = :all, attributes)
if id.is_a?(Array)
if id.any?(ActiveRecord::Base)
raise ArgumentError,
"You are passing an array of ActiveRecord::Base instances to `update!`. " \
"Please pass the ids of the objects by calling `pluck(:id)` or `map(&:id)`."
end
id.map { |one_id| find(one_id) }.each_with_index { |object, idx|
object.update!(attributes[idx])
}
elsif id == :all
all.each { |record| record.update!(attributes) }
else
if ActiveRecord::Base === id
raise ArgumentError,
"You are passing an instance of ActiveRecord::Base to `update!`. " \
"Please pass the id of the object by calling `.id`."
end
object = find(id)
object.update!(attributes)
object
end
end Обновляет объект (или несколько объектов) так же, как update, но вызывает update! вместо update, поэтому, если запись недопустима и сохранить её не удастся, будет вызвано исключение.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.