module 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, allow_retry: false, &block)
with_connection do |c|
_query_by_sql(c, sql, binds, preparable: preparable, allow_retry: allow_retry, async: true)
end.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-оператора, в части SELECT которого должно содержаться только COUNT(*). Этот метод следует использовать только для сложных 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-строки запроса на основе пользовательского ввода может подвергнуть ваше приложение атакам с внедрением кода.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.