0

我有2个模型如下:

Client
has_many :cases

Case
belongs_to :client

假设我有 2 个客户 c1 和 c2。
c1 有 1 例,c2 有 2 例。

c1    = Client.create(name: 'C1')
c2    = Client.create(name: 'C2')
case1 = Case.create(type: 'Normal', client: c1)
case2 = Case.create(type: 'Normal', client: c2)
case3 = Case.create(type: 'High', client: c2)

我想获取所有客户端并按每个客户端 asc/desc 的最后一个案例类型进行排序。所以如果我按 asc 排序,我应该得到 'c1' 然后是 c2 的结果。如果我按 desc 排序,我应该得到 'c2' 然后 'c1' 的结果。以下是我迄今为止尝试过的。

Client.includes(:cases).order('cases.type asc') # => 'C2,C1'
Client.includes(:cases).order('cases.type desc') # => 'C2,C1'

由于 c2 也有一个“普通”类型的案例,我认为查询似乎是先找到客户端,然后它会执行类似于 client.cases 的操作。然后,我认为它只在每个客户端下订购案例,而不是跨客户端订购案例。
我觉得我的解释有点混乱。如果你有,请给我一个问题。谢谢。

4

3 回答 3

0

我已更改列“case_type”而不是“type”,因为我们不能在表中使用列类型。

要按客户案例的最后记录的案例类型对数据进行排序,请尝试此操作。

对于 ASC

Client.includes(:cases).sort_by{|m| m.cases.last.case_type}

对于 DESC

 Client.includes(:cases).sort_by{|m| m.cases.last.case_type}.reverse
于 2016-09-14T09:02:13.663 回答
0

您可以为一个有很多关联设置一个默认排序器,如下所示:

has_many :cases, -> { order 'type asc' }

这样,案件将始终按顺序返回。因此,您可以使用 sort_by 在您的客户上设置自定义排序,调用最后一个案例(并确信这些案例是有序的),例如:

Client.includes(:cases).sort_by { |c| c.cases.last.type }
于 2016-09-14T09:03:13.477 回答
0

在我看来,一切都很好。您的订单声明仅确保typeor的顺序case_type。数据库可以返回

Normal, C1
Normal, C2
High, C2

或者

Normal, C2
Normal, C1
High, C2

为了cases.type asc

type等于你没有指定时应该发生什么。Rails 将按照数据库返回记录的顺序返回您的对象。

如果您不想再给您下订单,则必须指定订单,例如:

Client.includes(:cases).order('cases.type asc, clients.name asc')

编辑:

要仅对最后一条相关记录进行排序,您可以使用子选择:

Client.select('(SELECT cases.type from cases where cases.client_id=clients.id ORDER BY cases.id desc LIMIT 1) as case_type_name, *').order('case_type_name asc')
于 2016-09-14T10:51:22.627 回答