модуль ActiveRecord::Querying
Публичные методы экземпляра
# File activerecord/lib/active_record/querying.rb, line 93
def count_by_sql(sql)
connection.select_value(sanitize_sql(sql), "#{name} Count").to_i
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 49 def find_by_sql(sql, binds = [], preparable: nil, &block) _load_from_sql(_query_by_sql(sql, binds, preparable: preparable), &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-запроса из пользовательского ввода может подвергнуть ваше приложение атакам с использованием инъекций (guides.rubyonrails.org/security.html#sql-injection).
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.