Spec-Zone.ru › Ruby on Rails 7.2

модуль 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, &block) Показать исходный код
# 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.

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-запроса из пользовательского ввода может подвергнуть вашу программу атакам типа 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