首页 > 解决方案 > 我可以使用 Arel 创建的别名作为包含的一部分而不是加入来进行急切获取吗

问题描述

我有一个自引用关系,其中员工将引用与其主管相同的表。我需要查询表并能够按“supervisor.first_name”排序,技术上是“employees.first_name”。我能够使用 Arel 创建一个连接,但是我需要急切地获取它,以便我可以在order子句中使用该别名。

immediate_supervisor_alias = Employee.arel_table.alias(:supervisor)
  supervisor_join = immediate_supervisor_alias.create_on(
      Employee.arel_table[:id].eq(immediate_supervisor_alias[:id])
)

然后我像这样使用它......

@employees = Employee.joins(
          Employee.arel_table.create_join(
              immediate_supervisor_alias, supervisor_join, Arel::Nodes::OuterJoin
          )
      )
      .includes(...)
      .order('supervisor.first_name ASC')

这可行,但无法排序,因为主管是延迟加载的。我需要它是一个,includes但我找不到任何关于如何在那里使用别名的信息。Arel API 文档没有太大帮助。

标签: ruby-on-railsruby-on-rails-5rails-activerecordalias

解决方案


好吧,我让它工作了。我不知道这是否是最好的方法,但它确实有效,所以除非有人提出更好的答案,否则称之为好。

@employees = Employee.joins(
          Employee.arel_table.create_join(
              immediate_supervisor_alias, supervisor_join, Arel::Nodes::OuterJoin
          )
      )
      .select('supervisor.id, supervisor.last_name, supervisor.first_name')
      .includes(...)
      .order('supervisor.first_name ASC')

注意添加select.


推荐阅读