跳至内容 跳至搜索
方法
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 查询字符串可能会使你的应用程序暴露于注入攻击 (guides.rubyonrails.org/security.html#sql-injection).

# 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