如何在 Rails 中链接原始 SQL 查询或如何从 Rails 中的原始 SQL 查询链接 return 一个 ActiveRecord_Relation?
How to chain raw SQL queries in Rails OR how to return an ActiveRecord_Relation from a raw SQL query in Rails?
如何 运行 原始 sql 查询并返回 ActiveRecord_Relation
实例?
在 sqlite3 数据库和 Rails 4.2 上,ActiveRecords::Base.exec_query(sql)
returns 一个 ActiveRecord_Result
实例。 ActiveRecords::Base.execute(sql)
returns 一个数组。这很麻烦,因为我无法 运行 后续 "ActiveRecord queries" 或原始 sql 查询返回的对象。
更一般地说,我想知道如何在 Rails 中链接 "complex" sql 查询。我所说的复杂是指我无法通过 ActiveRecords 给出的 "ORM methods" 找到一种方法。通过链接,我的意思是出于性能原因,我想将其分解为几个 SQL 查询。示例:我只是想 运行 大而重的先 SQL 查询一次,存储结果然后 运行 较轻的 sql 查询取决于用户行为。
我目前正在尝试通过 dataTables 使用服务器端处理来优化数据库可视化。每次用户与 table 交互时,服务器都必须 运行 一个不必要的复杂 SQL 查询,因为我无法将其分解为更简单的查询。我查看了以下问题,但无法找到令人满意的解决方案:
Rails raw SQL example
Convert Array#select to active record query in rails 4
这是从 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
如何 运行 原始 sql 查询并返回 ActiveRecord_Relation
实例?
在 sqlite3 数据库和 Rails 4.2 上,ActiveRecords::Base.exec_query(sql)
returns 一个 ActiveRecord_Result
实例。 ActiveRecords::Base.execute(sql)
returns 一个数组。这很麻烦,因为我无法 运行 后续 "ActiveRecord queries" 或原始 sql 查询返回的对象。
更一般地说,我想知道如何在 Rails 中链接 "complex" sql 查询。我所说的复杂是指我无法通过 ActiveRecords 给出的 "ORM methods" 找到一种方法。通过链接,我的意思是出于性能原因,我想将其分解为几个 SQL 查询。示例:我只是想 运行 大而重的先 SQL 查询一次,存储结果然后 运行 较轻的 sql 查询取决于用户行为。
我目前正在尝试通过 dataTables 使用服务器端处理来优化数据库可视化。每次用户与 table 交互时,服务器都必须 运行 一个不必要的复杂 SQL 查询,因为我无法将其分解为更简单的查询。我查看了以下问题,但无法找到令人满意的解决方案:
Rails raw SQL example
Convert Array#select to active record query in rails 4
这是从 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