Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表

Posted

技术标签:

【中文标题】Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表【英文标题】:Rails Activerecord Relation: using subquery as a table for a SQL select statement 【发布时间】:2014-08-12 07:33:19 【问题描述】:

有人可以帮我弄清楚如何使用 Rails(我正在使用 Rails 4)Activerecord 方法编写以下 SQL 吗?我知道你可以用 find_by_sql 做到这一点,但我想保留活动记录关系。这是我正在尝试创建的 postGreSQL 数据库的 sql:

SELECT * FROM 
(SELECT DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.id, table_b.time
FROM table_1
LEFT OUTER JOIN table_b ON table_a.id = table_b.id
ORDER BY table_a.id, table_b.time asc) AS subquery
ORDER BY alias_a asc

对于我的子查询,我有以下内容(生成上面子查询的 sql):

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")     
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id")
@subquery = @subquery.order("table_a.id, table_b.time asc")

但是,我不知道如何编写使用@subquery 作为外部选择语句的表的选择语句。

【问题讨论】:

【参考方案1】:

使用 Active Record 接口中的from() 方法。

例如:

@subquery = table_a.select("DISTINCT ON(table_a.id) table_a.name as alias_a, table_b.time")     
@subquery = @subquery.joins("LEFT OUTER JOIN table_b ON table_a.id = table_b.id")
@subquery = @subquery.order("table_a.id, table_b.time asc")

然后在外部查询中这样使用:

@query = OtherModel.from("(#@subquery.to_sql) table_name, other_model_table, etc ...").where(:field => table_name.alias_a) ...etc.

【讨论】:

谢谢!为了将来参考,我在以下位置找到了 rails 的查询方法列表:api.rubyonrails.org/classes/ActiveRecord/…【参考方案2】:

这个更优雅:

@subquery = Model.balalalala
@query = OtherModel.from(@subquery, :sub_query).where(sub_query: column_b: balalala).order('sub_query.column_a')

【讨论】:

以上是关于Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 ActiveRecord 有很多通过关系不能从 sql 文件读取

Rails ActiveRecord关系无效外键错误

Rails:在 HABTM 关系中将子项从大型记录集添加到父模型的 UI

检索ActiveRecord / Rails中没有关系的对象

如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多

ActiveRecord Rails 3 范围与类方法