Rails - 自我引用的顺序包括

时间:2017-02-28 12:39:16

标签: ruby-on-rails-3 activerecord

遇到一个我之前没遇到的问题,似乎无法在任何地方找到一个令人沮丧的解决方案。基本上我有一个包含invited_by_id列的用户表,引用相同的用户表。

我现在正在尝试创建一个查询,根据邀请的用户名对结果进行排序,但是在这里使用通常的活动记录排序并不真正起作用

User
.includes(:invited_by)
.order("users.name ASC")

因为这两个表都是相同的,所以看起来rails选择第一个,而不是invite_by关联。

有没有办法指定我想在协会上订购?

更多信息

我试图在活动记录mixin中使用它,所以我不会直接在基类上调用它,并且它需要使用现有作用域,因为将在作用域上调用混合方法。例如

User
.includes(:invited_by)
.where(where_clause)
.sort(:invited_by_name, :asc)

这里,mixin提供了sort方法,这是它需要能够区分表格的地方。我有逻辑意味着它知道关系是什么,所以它知道:invited_by_name是:invite_by关系的名称列,但这就是我所拥有的。

1 个答案:

答案 0 :(得分:0)

您需要使用不同的名称引用同一个表。您可以使用Arel

执行此操作
guest = Arel::Table.new(:users, :as => 'guest')
inviter = Arel::Table.new(:users, :as => 'inviter')

relation = guest.
  project(Arel.sql('*')).
  join(inviter).on(guest[:invited_by_id].eq(inviter[:id])).
  order(inviter[:name])

@users = relation.to_sql
相关问题