Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveRecord::Querying

Общедоступные методы экземпляров

async_count_by_sql(sql) Показать исходный код
# File activerecord/lib/active_record/querying.rb, line 106
def async_count_by_sql(sql)
  connection.select_value(sanitize_sql(sql), "#{name} Count", async: true).then(&:to_i)
end

Аналогично #count_by_sql, но выполняет запрос асинхронно и возвращает ActiveRecord::Promise.

async_find_by_sql(sql, binds = [], preparable: nil, &block) Показать исходный код
# File activerecord/lib/active_record/querying.rb, line 55
def async_find_by_sql(sql, binds = [], preparable: nil, &block)
  _query_by_sql(sql, binds, preparable: preparable, async: true).then do |result|
    _load_from_sql(result, &block)
  end
end

Аналогично #find_by_sql, но выполняет запрос асинхронно и возвращает ActiveRecord::Promise.

count_by_sql(sql) Показать исходный код
# File activerecord/lib/active_record/querying.rb, line 101
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-запрос, который должен возвращать количество из базы данных, см. пример выше.

find_by_sql(sql, binds = [], preparable: nil, &block) Показать исходный код
# File activerecord/lib/active_record/querying.rb, line 50
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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API