如何在Rails中链接原始SQL查询或如何从Rails中的原始SQL查询返回ActiveRecord_Relation?

Fra*_*ues 7 sql sqlite activerecord database-connection ruby-on-rails

如何运行原始sql查询并获取ActiveRecord_Relation实例返回?

在sqlite3 db和Rails 4.2上,ActiveRecords::Base.exec_query(sql)返回一个ActiveRecord_Result实例。ActiveRecords::Base.execute(sql)返回一个数组。这很麻烦,因为我无法在返回的对象上运行后续的“ ActiveRecord查询”或原始sql查询。

更一般而言,我想知道如何在Rails中链接“复杂”的SQL查询。复杂地说,我无法通过ActiveRecords提供的“ ORM方法”找到解决方法。通过链接,我的意思是出于性能原因,我想在几个SQL查询中对其进行分解。示例:我只想先运行一次繁重的SQL查询,然后存储结果,然后根据用户行为运行较轻的sql查询。

我目前正在尝试通过使用服务器端处理实现的dataTables优化数据库可视化。每次用户与表进行交互时,服务器都必须运行不必要的复杂SQL查询,因为我无法在更简单的查询中对其进行分解。我查看了以下问题,但找不到令人满意的解决方案:

Rails原始SQL示例

在rails 4中将Array#select转换为活动记录查询

哈希/数组到活动记录

use*_*467 16

这是一种从 raw_sql 获取 ActiveRecord_Relation 的方法。
如果您确实有一个与您尝试检索的字段匹配的模型,则效果最佳,但正如您在 test_attribute 中看到的那样,任何数据都将被加载。

# Just an example query, any query should be ok
query = <<-SQL
  SELECT *, TRUE AS test_attribute
  FROM users
  WHERE sign_in_count < 10
SQL
relation = User.select('*').from("(#{query}) AS users")

relation.class
# User::ActiveRecord_Relation

relation.first.test_attribute
# true
Run Code Online (Sandbox Code Playgroud)

  • 哇,这为我提供了一种将一些 find_by_sql 函数转换为活动记录关系的绝佳方法。如果可能的话我会x10。 (3认同)