Rails关系排序?



所以我想把这个SQL查询翻译成Rails(并在这个确切的顺序):假设我有

WITH sub_table as (
SELECT * FROM main_table LIMIT 10 OFFSET 100 ORDER BY id
)
SELECT * FROM sub_table INNER JOIN other_table
ON sub_table.id = other_table.other_id

重要的是执行顺序必须是:

  1. sub_table查询必须先执行的LIMIT和OFFSET
  2. 第二条语句应该出现在。

如果我的关系被称为OtherTableMainTable就像这样工作:

subTableRelation = MainTable.order(id: :asc).limit(10).offset(100)
subTableRelation.join(OtherTable, ....)

这里的主要问题是Rails关系的执行顺序如何影响事情。

虽然ActiveRecord在其高级API中没有提供cte,但Arel将允许您构建这个精确的查询。

由于您没有提供模型并且混淆了表名,因此我将暂时完全在Arel中构建它。

sub_table = Arel::Table.new('sub_table')
main_table = Arel::Table.new('main_table')
other_table = Arel::Table.new('other_table')
sub_table_query = main_table.project(Arel.star).take(10).skip(100).order(main_table[:id])
sub_table_alias = Arel::Nodes::As.new(Arel.sql(sub_table.name),sub_table_query)
query = sub_table.project(Arel.star)
.join(other_table).on(sub_table[:id].eq(other_table[:other_id]))
.with(sub_table_alias)
query.to_sql

输出:

WITH sub_table AS (
SELECT 
* 
FROM main_table 
ORDER BY main_table.id
-- Output here will differ by database
LIMIT 10 OFFSET 100 
)
SELECT 
* 
FROM sub_table 
INNER JOIN other_table ON sub_table.id = other_table.other_id

如果你能够提供更好的上下文,我可以提供一个更好的解决方案,最有可能导致一个ActiveRecord::Relation对象,这可能是更适合链接和模型访问的目的。

相关内容

  • 没有找到相关文章

最新更新