所以我想把这个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
重要的是执行顺序必须是:
sub_table
查询必须先执行的LIMIT和OFFSET- 第二条语句应该出现在。
如果我的关系被称为OtherTable
和MainTable
就像这样工作:
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对象,这可能是更适合链接和模型访问的目的。