获取将从某个方法或named_scope执行的SQL

时间:2009-06-10 06:40:57

标签: ruby-on-rails activerecord

给定一个ActiveRecord方法或named_scope链,是否有办法返回将被执行的SQL,而不实际运行它?

e.g。

Vote.positive.count.sql #=> "SELECT COUNT(*) FROM votes WHERE value > 0"

是否有内置方法可以执行此操作或提供此功能的插件?如果没有,那么我可以开始构建自己的插件的任何线索,或者至少是当前项目的解决方案。

干杯

2 个答案:

答案 0 :(得分:4)

您可以从命名范围中获取信息,如下所示:

Vote.positive.proxy_options

至于获取完整的SQL语句,ActiveRecord使用名为construct_finder_sql的受保护方法将它们组合在一起。

所以你可以试试这个:

Vote.positive.send(:construct_finder_sql, {})

计算查询使用的方法不同:

Vote.positive.send(:construct_calculation_sql, :count, :id, {})

在这两种情况下,空哈希参数都可以包含:conditions:order:limit等密钥,或者您可以通过检查这些方法的主体来发现一些其他选项。

答案 1 :(得分:1)

这已经很久了,但我认为指出Rails3会在最终击中数据库的任何范围/查找器/模型方法上都支持这一点是有用的。