модуль ActiveRecord::Querying
Публичные методы экземпляра
# File activerecord/lib/active_record/querying.rb, line 63
def count_by_sql(sql)
sql = sanitize_conditions(sql)
connection.select_value(sql, "#{name} Count").to_i
end Возвращает результат SQL-запроса, который должен содержать только COUNT(*) в части SELECT. Использование этого метода должно быть ограничено сложными SQL-запросами, которые нельзя выполнить с помощью методов класса ActiveRecord::Calculations. Посмотрите их перед использованием этого метода.
Параметры
-
sql- SQL-запрос, который должен вернуть количество строк из базы данных, см. пример ниже.Product.count_by_sql “SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id”
# File activerecord/lib/active_record/querying.rb, line 38
def find_by_sql(sql, binds = [])
result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
column_types = result_set.column_types.dup
columns_hash.each_key { |k| column_types.delete k }
message_bus = ActiveSupport::Notifications.instrumenter
payload = {
record_count: result_set.length,
class_name: name
}
message_bus.instrument('instantiation.active_record', payload) do
result_set.map { |record| instantiate(record, column_types) }
end
end Выполняет пользовательский SQL-запрос в вашей базе данных и возвращает все результаты. Результаты будут возвращены в виде массива, где столбцы, запрошенные в запросе, будут представлены как атрибуты модели, с которой вы вызываете этот метод. Если вы вызываете Product.find_by_sql, результаты будут возвращены в объекте Product, с атрибутами, которые вы указали в SQL-запросе.
Если вы вызываете сложный SQL-запрос, охватывающий несколько таблиц, столбцы, указанные в SELECT, будут атрибутами модели, независимо от того, являются ли они столбцами соответствующей таблицы.
Параметр sql — это полный SQL-запрос в виде строки. Он будет вызван как есть, не будет выполняться преобразование в базу данных, независимую от движка. Это должно быть крайним случаем, так как использование, например, специфичных для MySQL терминов заблокирует вас использованием именно этого движка базы данных или потребует изменения вызова, если вы измените движок.
# A simple SQL query spanning multiple tables
Post.find_by_sql "SELECT p.title, c.author FROM posts p, comments c WHERE p.id = c.post_id"
# => [#<Post:0x36bff9c @attributes={"title"=>"Ruby Meetup", "first_name"=>"Quentin"}>, ...]
Вы можете использовать те же методы подстановки строк, что и с ActiveRecord::QueryMethods#where:
Post.find_by_sql ["SELECT title FROM posts WHERE author = ? AND created > ?", author_id, start_date]
Post.find_by_sql ["SELECT body FROM comments WHERE author = :user_id OR approved_by = :user_id", { :user_id => user_id }]
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.