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

时间:2017-12-19 19:25:51

标签: sql ruby-on-rails activerecord sqlite database-connection

如何运行原始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 raw SQL example

Convert Array#select to active record query in rails 4

Hash/Array to Active Record

1 个答案:

答案 0 :(得分:0)

这是一种从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