Rails 关系排序?

Rails relation ordering?

所以我想将这个 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. 第二条语句应该发生在之后。

所以如果我的关系被称为 OtherTable 并且 MainTable 做这样的工作:

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

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

虽然 ActiveRecord 不提供高级别的 CTE API,但 Arel 将允许您构建这个确切的查询。

由于您没有提供模型并且混淆了 table 名称,我将暂时完全在 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 对象,该对象可能更适合链接和模型访问目的。