实例公共方法
async_count_by_sql(sql) 链接
与 count_by_sql 相同,但以异步方式执行查询并返回一个 ActiveRecord::Promise。
来源: 显示 | 在 GitHub 上
# 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。
来源: 显示 | 在 GitHub 上
# 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 语句,应从数据库返回计数查询,请参阅上面的示例。
来源: 显示 | 在 GitHub 上
# 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 查询字符串 可能会使您的应用程序面临注入攻击。
来源: 显示 | 在 GitHub 上
# 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