Rails - find_by_sql vs活动记录查询

时间:2014-01-07 00:43:15

标签: sql ruby-on-rails rails-activerecord

我想使用find_by_sql方法代替活动记录查询接口,因为我在编写自己的SQL时具有灵活性。

例如,

  1. 在SQL中,将查询中的表从最小到最大排序是一种很好的做法。使用活动记录查询界面时,您必须从可能是最大表的结果模型开始。

  2. 我还可以通过在连接本身中包含目标表并包含多个表中所需的列来轻松避免N + 1问题。

    我想知道是否有理由不应该使用find_by_sql选项,特别是当我编写的ANSI SQL应该与所有(如果不是大多数)数据库兼容时。

  3. 谢谢!

1 个答案:

答案 0 :(得分:9)

通常不鼓励直接编写SQL代码,因为它会阻止您访问SQL查询的延迟执行等功能,并可能导致无效或不安全的查询。

实际上,ActiveRecord会自动将Ruby对象转换为相应的SQL语句(例如将范围转换为BETWEEN或将数组转换为IN),从SQL注入过滤字符串,ActiveRecord :: Relations提供延迟查询执行。

也就是说,如果您知道自己在做什么或使用ActiveRecord来实现特定查询会非常复杂,那么编写SQL并没有错。

我的建议是避免对可以在ActiveRecord和AREL中轻松复制的查询执行此操作。