Spec-Zone.ru › Ruby on Rails 4.1

модуль ActiveRecord::Querying

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

count_by_sql(sql) Показать исходный код

Возвращает результат SQL-запроса, который должен включать только COUNT(*) в части SELECT. Использование этого метода должно быть ограничено сложными SQL-запросами, которые нельзя выполнить с помощью методов класса ActiveRecord::Calculations. Рассмотрите их перед использованием этого.

Параметры

  • sql - SQL-запрос, который должен возвращать количество записей из базы данных, см. пример ниже.

    Product.count_by_sql “SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id”

# File activerecord/lib/active_record/querying.rb, line 60
def count_by_sql(sql)
  sql = sanitize_conditions(sql)
  connection.select_value(sql, "#{name} Count").to_i
end
find_by_sql(sql, binds = []) Показать исходный код

Выполняет пользовательский 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 }]
# File activerecord/lib/active_record/querying.rb, line 38
def find_by_sql(sql, binds = [])
  result_set = connection.select_all(sanitize_sql(sql), "#{name} Load", binds)
  column_types = {}

  if result_set.respond_to? :column_types
    column_types = result_set.column_types
  else
    ActiveSupport::Deprecation.warn "the object returned from `select_all` must respond to `column_types`"
  end

  result_set.map { |record| instantiate(record, column_types) }
end

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

Spec-Zone.ru

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