给定一个ActiveRecord方法或named_scope
链,是否有办法返回将被执行的SQL,而不实际运行它?
e.g。
Vote.positive.count.sql #=> "SELECT COUNT(*) FROM votes WHERE value > 0"
是否有内置方法可以执行此操作或提供此功能的插件?如果没有,那么我可以开始构建自己的插件的任何线索,或者至少是当前项目的解决方案。
干杯
答案 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会在最终击中数据库的任何范围/查找器/模型方法上都支持这一点是有用的。