2

私は2つのモデルを持っています:

class Doctor < ActiveRecord::Base
  has_and_belongs_to_many :branches
end

class Branch < ActiveRecord::Base
  has_and_belongs_to_many :doctors
end                             

ASCまたはDescのいずれかのブランチ名で医師のリスト(インデックスアクション)を並べ替えたいと思います。これどうやってするの?

4

1 に答える 1

1

このコンテキストでは、HABTM 関連付けが他の 1 対多と異なる動作をするとは思わないのでselect()、 、group()、および を使用するとorder()、おそらく次のようになります。

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

当然のことながら、これを集約する方法を選択する必要があります。Doctor は多くのブランチを持つことができるため、順序付けに使用する名前を指定する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)。

于 2013-01-30T21:24:48.240 に答える