跳至内容 跳至搜索
方法
A
C
F

实例公共方法

async_count_by_sql(sql)

count_by_sql 相同,但以异步方式执行查询并返回一个 ActiveRecord::Promise

# 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

async_find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block)

find_by_sql 相同,但以异步方式执行查询并返回一个 ActiveRecord::Promise

# 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

count_by_sql(sql)

返回一个 SQL 语句的结果,该语句仅在 SELECT 部分包含 COUNT(*)。 此方法的用法应限于无法使用 ActiveRecord::Calculations 类方法执行的复杂 SQL 查询。 在使用此方法之前,请先研究那些方法,因为它可能会将您锁定在特定的数据库引擎中,或者在切换数据库引擎时需要更改代码。

Product.count_by_sql "SELECT COUNT(*) FROM sales s, customers c WHERE s.customer_id = c.id"
# => 12

参数

  • 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

find_by_sql(sql, binds = [], preparable: nil, allow_retry: false, &block)

执行自定义 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 查询字符串 可能会使您的应用程序面临注入攻击

# 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