1. ホーム
  2. ruby-on-rails

スコープ with join on :has_many :through association

2023-08-06 09:21:43

質問

class Users < ActiveRecord::Base
  has_many :meetings, :through => :meeting_participations
  has_many :meeting_participations
end

class Meetings < ActiveRecord::Base
  has_many :users, :through => :meeting_participations
  has_many :meeting_participations
end

class MeetingParticipations < ActiveRecord::Base
  belongs_to :user
  belongs_to :meeting

  scope :hidden, where(:hidden => true)
  scope :visible, where(:hidden => false)
end

hidden は、m2m association テーブルに追加された boolean カラムです。与えられたいくつかの Users インスタンス current_user を行いたい。

current_user.meetings.visible

のコレクションを取得します。 Meetings のコレクションを取得し、そのユーザが参加者である場合 hidden カラムが false . 私が得た最も近い方法は、次のスコープを Meetings クラス

scope :visible, joins(:meeting_participations) & MeetingParticipation.visible

scope をフィルタリングします。 Meetings に対して MeetingParticipations テーブルに対するジョインやコンディションはありません。 MeetingParticipations テーブルに関連する current_user .

これの問題点は、もし current_useranother_user はともに、ある Meetings インスタンス、つまり Meetings を持つ参加者ごとに結果セットのレコードが返されます。 hidden に設定されている false . もし current_user があれば true に設定されています。 hidden すべて Meetings であれば another_user が同じ会議の参加者で hidden に設定されている false は、それらの Meetings の中に表示されます。 Meetings.visible の結果セットに表示されます。

に適切に結合する、上に述べたようなスコープを持つことは可能でしょうか? User インスタンスに適切に結合することは可能でしょうか?そうでない場合、どなたかこれに対する解決策を紹介していただけませんか?

どのように解決するには?

これは、あなたの問題に対する私の解決策です。

class User < ActiveRecord::Base
  has_many :meeting_participations
  has_many :meetings, :through => :meeting_participations do
   def visible
     where("meeting_participations.visible = ?", true)
   end
  end
end

@user.meetings.visible