Spec-Zone.ru › Ruby on Rails 5.0

модуль ActiveRecord::Querying

Открытые методы экземпляра

count_by_sql(sql) Показать исходный код
# File activerecord/lib/active_record/querying.rb, line 64
def count_by_sql(sql)
  sql = sanitize_conditions(sql)
  connection.select_value(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 38
def find_by_sql(sql, binds = [], preparable: nil, &block)
  result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds, preparable: preparable)
  column_types = result_set.column_types.dup
  columns_hash.each_key { |k| column_types.delete k }
  message_bus = ActiveSupport::Notifications.instrumenter

  payload = {
    record_count: result_set.length,
    class_name: name
  }

  message_bus.instrument("instantiation.active_record", payload) do
    result_set.map { |record| instantiate(record, column_types, &block) }
  end
end

Выполняет пользовательский SQL-запрос к базе данных и возвращает все результаты. Результаты будут возвращены в виде массива, где столбцы, запрошенные в запросе, будут представлены в качестве атрибутов модели, из которой вы вызываете этот метод. Если вы вызываете Product.find_by_sql, то результаты будут возвращены в объекте Product с атрибутами, указанными в SQL-запросе.

Если вы вызываете сложный SQL-запрос, охватывающий несколько таблиц, столбцы, указанные в SELECT, будут атрибутами модели, независимо от того, являются ли они столбцами соответствующей таблицы.

Параметр sql — это полный SQL-запрос в виде строки. Он будет вызван как есть, никакие преобразования, независимые от базы данных, не будут выполнены. Это должно быть крайнее решение, потому что использование, например, специфичных для MySQL терминов, заблокирует вас использованием конкретного движка базы данных или потребует изменения вашего вызова, если вы переключите движки.

# 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", "first_name"=>"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 }]

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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