Rails-通过sql与活动记录查询查找

Rails-通过sql与活动记录查询查找,sql,ruby-on-rails,rails-activerecord,Sql,Ruby On Rails,Rails Activerecord,我想使用find_by_sql方法来代替活动记录查询接口,因为我在编写自己的sql时具有灵活性 比如说, 在SQL中,将查询中的表从最小到最大排序被认为是一种很好的做法。使用活动记录查询界面时,必须从结果模型开始,该模型可能是最大的表 通过将目标表包含在联接本身中,并包含多个表中所需的列,还可以轻松避免N+1问题 我想知道我是否有理由不使用find_by_sql选项,特别是当我将编写ANSI sql时,它应该与所有(如果不是大多数)数据库兼容 谢谢 通常不鼓励直接编写SQL代码,因为这样会阻止您

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

比如说,

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

  • 通过将目标表包含在联接本身中,并包含多个表中所需的列,还可以轻松避免N+1问题

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


  • 谢谢

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

    事实上,ActiveRecord会自动将Ruby对象转换为相应的SQL语句(例如范围转换为介于之间或数组转换为In),过滤SQL注入中的字符串,ActiveRecord::Relations提供延迟查询执行

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


    我的建议是,对于可以在ActiveRecord和AREL中轻松复制的查询,避免这样做。

    在处理了数百万行数据后,我决定不值得花时间编写自己的sql进行优化。ActiveRecrod已经足够好了,足够好的东西对我来说可以处理数百万行数据。好的,谢谢。例如,当您使用includes时,它会在后台使用IN子句创建另一个SQL。好吧,使用“where-IN”应该创建一个表扫描,因此不鼓励使用。我认为AR查询接口在幕后使用AREL。AREL提供的功能是否比查询接口更多?ActiveRecord使用AREL,但它没有公开所有功能。例如,在Rails 4之前,不可能使用ActiveRecord或通过ActiveRecord连接不同的where条件,但使用AREL是可能的。