2017-02-28 20 views
0

遇到我以前没有遇到的问题,并且似乎无法在任何地方找到解决方案,令人沮丧。基本上我有一个用户表,其中包含一个invited_by_id列,引用相同的用户表。导轨 - 通过自我指示排序包括

现在我想创建一个查询它排序基础上,邀请用户名的成绩,但是使用通常的活动记录在这里整理并未真正发挥作用

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

因为无论是表有问题的是同一个,似乎铁轨选择第一个,而不是invite_by协会。

有没有什么方法可以指定我想要在关联上订购?

更多信息

我试图在一个活动记录混入使用这一点,所以我不会在基类中直接调用此,它需要与现有的范围,因为混合工作方法将在范围上调用。例如

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

这里,sort方法由混入提供,并且这是它需要能够在表之间进行区分。我有逻辑,这意味着它知道关系是什么,所以它知道:invited_by_name是:invite_by关系的名称列,但是就我而言。

回答

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 
+0

这是否与现有的范围工作?这将是一个混合内部链接,所以需要与现有的范围,而不是直接用户模型 – PaReeOhNos

+0

嗯,不,我看不到它的工作,甚至想象如何尝试它。我刚刚用范围搜索了Arel,并没有看到任何可用的东西。有关于更改Arel节点的博客条目,但我不确定这对您有多大帮助... https://www.viget.com/articles/composable-sql-queries-in-rails-using-arel – SteveTurczyn

+0

嗯没有这是我的问题:(将继续挖掘 – PaReeOhNos