如何在HABTM协会中确定范围?

时间:2013-01-30 21:06:38

标签: ruby-on-rails-3 rails-activerecord

我有两种模式:

class Doctor < ActiveRecord::Base
  has_and_belongs_to_many :branches
end

class Branch < ActiveRecord::Base
  has_and_belongs_to_many :doctors
end                             

我想通过分支名称ASC或Desc来命令医生列表(索引操作)。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我不认为HABTM协会在这种情况下的工作方式与其他任何一对多协议不同,因此您使用select()group()order(),可能是这样的:

@doctors = Doctor.joins(:branches).group('doctors.id').order('max(branches.name)')

当然,您需要选择如何聚合 - 医生可以拥有多个分支,因此您必须指定在排序中使用的名称 - max()可能不是正确的聚合函数满足您的需求。

请注意,这将排除任何没有任何关联分支的Doctor模型,因为joins的默认设置是使用内部联接。如果你不想这样做,你可能需要手动编写joins,以便它使用左连接而不是内部连接,如下所示:

joins('left join branches_doctors on doctors.id = branches_doctors.doctor_id left join branches on branch.id = branches_doctors.branch_id')

HABTM连接表的默认名称是按字母顺序排列的两种模型的复数形式(因此branches_doctors,而不是doctors_branches)。