модуль ActiveRecord::Querying
Открытые методы экземпляров
# File activerecord/lib/active_record/querying.rb, line 116
def async_count_by_sql(sql)
with_connection do |c|
c.select_value(sanitize_sql(sql), "#{name} Count", async: true).then(&:to_i)
end
end То же, что и #count_by_sql, но выполняет запрос асинхронно и возвращает ActiveRecord::Promise.
# File activerecord/lib/active_record/querying.rb, line 59
def async_find_by_sql(sql, binds = [], preparable: nil, &block)
result = with_connection do |c|
_query_by_sql(c, sql, binds, preparable: preparable, async: true)
end
result.then do |result|
_load_from_sql(result, &block)
end
end То же, что и #find_by_sql, но выполняет запрос асинхронно и возвращает ActiveRecord::Promise.
# File activerecord/lib/active_record/querying.rb, line 109
def count_by_sql(sql)
with_connection do |c|
c.select_value(sanitize_sql(sql), "#{name} Count").to_i
end
end Возвращает результат SQL-запроса, который должен содержать только COUNT(*) в части SELECT. Использование этого метода следует ограничить сложными SQL-запросами, которые нельзя выполнить с помощью методов класса ActiveRecord::Calculations. Рассмотрите их прежде, чем использовать этот метод, так как это может заблокировать вас в определенной СУБД или потребовать изменения кода для переключения СУБД.
Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id" # => 12
Параметры
-
sql— SQL-запрос, который должен возвращать количество записей из базы данных, см. пример выше.
# File activerecord/lib/active_record/querying.rb, line 51
def find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block)
result = with_connection do |c|
_query_by_sql(c, sql, binds, preparable: preparable, allow_retry: allow_retry)
end
_load_from_sql(result, &block)
end Выполняет пользовательский SQL-запрос в вашей базе данных и возвращает все результаты. Результаты будут возвращены в виде массива, где запрошенные столбцы будут упакованы как атрибуты модели, из которой вы вызвали этот метод. Например, если вы вызываете Product.find_by_sql, то результаты будут возвращены в объекте Product с атрибутами, которые вы указали в SQL-запросе.
Если вы вызываете сложный SQL-запрос, охватывающий несколько таблиц, то столбцы, указанные в SELECT, будут атрибутами модели, независимо от того, являются ли они столбцами соответствующей таблицы.
Параметр sql — это полный SQL-запрос в виде строки. Он будет вызван как есть; никаких абстракций для разных баз данных не будет. Это должно быть крайнее средство, так как использование специфичных для СУБД терминов заблокирует вас при использовании этой СУБД или потребует изменения вашего вызова при переключении СУБД.
# 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", "author"=>"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 }]
Обратите внимание, что построение собственной строки SQL-запроса из пользовательского ввода может подвергнуть вашу программу атакам типа SQL-инъекции (guides.rubyonrails.org/security.html#sql-injection).
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.