Spec-Zone.ru › Ruby on Rails 8.0

модуль ActiveRecord::Querying

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

async_count_by_sql(sql) Показать исходный код
# 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.

async_find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block) Показать исходный код
# 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.

count_by_sql(sql) Показать исходный код
# 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-запрос, который должен вернуть количество строк из базы данных, см. пример выше.

find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block) Показать исходный код
# 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-запроса из пользовательского ввода может сделать ваш application уязвимым к атакам внедрения 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