복붙노트

[RUBY-ON-RAILS] has_many :와 범위에 가입 협회를 통해

RUBY-ON-RAILS

has_many :와 범위에 가입 협회를 통해

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

M2M 연관 테이블 내에서 추가 부울 열은 숨겨져. 일부 사용자 인스턴스 CURRENT_USER 감안할 때, 내가하고 싶은

current_user.meetings.visible

어떤 숨겨진 열이 거짓 인 경우 사용자가 참가자 인에 대한 회의의 컬렉션을 검색합니다. 내가 찍었을 가장 가까운 모임 클래스에 다음 범위를 추가

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

범위는 그러나 / CURRENT_USER 관련 MeetingParticipations 테이블에 대해 조인 조건을 더 없다, 필터에게 MeetingParticipations 테이블에 대한 회의를한다.

CURRENT_USER와 another_user 일부 회의 인스턴스 모두 참가자가있는 경우이 가진 문제는, 결과 세트의 회의 기록은 false로 설정 숨겨져있다 각 참가자에 대해 반환 될 것입니다. CURRENT_USER는 another_user false로 숨겨진 설정과 그 같은 회의의의 참여자 인 경우, 모든 회의에 대한 숨겨진 위해 true로 설정되어있는 경우, 그 회의는 Meetings.visible 결과 집합에 나타납니다.

내가 제대로 사용자 인스턴스에 가입 할 위에서 언급 한 바와 같이 범위가 할 수 있습니까? 그렇지 않다면, 누군가가이 문제를 해결하기위한 방안을 추천 할 수 있습니까?

해결법

  1. ==============================

    1.이 문제에 대한 내 솔루션입니다 :

    이 문제에 대한 내 솔루션입니다 :

    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

  2. ==============================

    2.레일 4, 당신은 원래 관계 자체에 자식 개체에 정의 된 범위를 지정할 수 있습니다. 짧은 : 당신은 사용자 모델 내에서 MeetingParticipation 모델의 내부를 알 필요가 없습니다.

    레일 4, 당신은 원래 관계 자체에 자식 개체에 정의 된 범위를 지정할 수 있습니다. 짧은 : 당신은 사용자 모델 내에서 MeetingParticipation 모델의 내부를 알 필요가 없습니다.

    class User < ActiveRecord::Base
      has_many :meeting_participations
      has_many :meetings, :through => :meeting_participations
      has_many :visible_participations, -> { visible }, :class_name => 'MeetingParticipation'
      has_many :visible_meetings, :source => :meeting, :through => :visible_participations
    end
    
    class Meeting < ActiveRecord::Base
      has_many :meeting_participations
      has_many :users, :through => :meeting_participations
    end
    
    class MeetingParticipation < ActiveRecord::Base
      belongs_to :user
      belongs_to :meeting
    
      scope :hidden, -> { where(:hidden => true) }
      scope :visible, -> { where(:hidden => false) }
    end
    

    이것은 당신이 할 수있는 것 : 다른 결과 세트와 user1.visible_meetings 및 user2.visible_meetings

  3. ==============================

    3.

    current_user.meetings.merge(MeetingParticipations.visible)
    
  4. ==============================

    4.그것을 할 수있는 깨끗하고 협회의 방법입니다 :

    그것을 할 수있는 깨끗하고 협회의 방법입니다 :

    has_many :visible_meetings, -> { merge(MeetingParticipations.visible) },
      :source => :meeting, :through => :meeting_participations
    

    더 일반적인 용어에 넣어하려면, 당신은 당신이 범위를 병합을 통해 범위 중간 (통해) 연결을 할 수있는 체인으로 연결된 has_many 협회가있는 경우. 아마 레일 4+가 필요합니다.

    그렇지 않으면이 @ 폴 Pettengill의 대답에서 볼로 (아마 원하지 않는) 중간 범위의 연결을 생성을 통해 수행되어야 할 것이다.

  5. ==============================

    5.여기에 하나의 라이너입니다 :

    여기에 하나의 라이너입니다 :

    Meeting.joins(:meeting_participations).where(meeting_participation: { hidden: false, user_id: current_user.id })
    

    당신이 그것의, 그것의 기능을 범위를 만들거나 단순히 어디서든 호출 할 수 있기 때문에 아주 좋습니다. 당신은 또한 당신이 해시 원하는 더 이상 제한을 추가 할 수 있습니다.

  6. ==============================

    6.나는이 질문에 한참을 대답했지만, 난 그냥 비슷한 문제가 발생하여이 문제를 처리하는 가장 좋은 방법을 둘러보고 있었다 알고있다. 허용되는 솔루션은 매우 간단하지만 아래의 예상대로 회의에 사용자로부터 협회의 범위를 이동하여 청소기가 될 것이라고 생각

    나는이 질문에 한참을 대답했지만, 난 그냥 비슷한 문제가 발생하여이 문제를 처리하는 가장 좋은 방법을 둘러보고 있었다 알고있다. 허용되는 솔루션은 매우 간단하지만 아래의 예상대로 회의에 사용자로부터 협회의 범위를 이동하여 청소기가 될 것이라고 생각

    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
      scope :hidden, -> { where('meeting_participations.hidden = ?', true) }
      scope :visible, -> { where('meeting_participations.hidden = ?', false) }
    end
    
    class MeetingParticipations < ActiveRecord::Base
      belongs_to :user
      belongs_to :meeting
    
      scope :hidden, where(:hidden => true)
      scope :visible, where(:hidden => false)
    end
    

    이, 당신은 current_user.meetings.hidden를 호출 할 수 있습니다

    디자인으로, 지금 회의가 숨김 / 표시 할 것을 지시.

  7. ==============================

    7.당신의 목적을 위해 회의의 범위를 사용하는 분별없는 것을 나에게 보인다. 회의 자체는 가시성이 없습니다, 그러나 참여 있습니다. 그래서 사용자 내에서 협회에 확장을 건의 할 것입니다 :

    당신의 목적을 위해 회의의 범위를 사용하는 분별없는 것을 나에게 보인다. 회의 자체는 가시성이 없습니다, 그러나 참여 있습니다. 그래서 사용자 내에서 협회에 확장을 건의 할 것입니다 :

    class User < ActiveRecord::Base
      has_many :meetings, :through => :meeting_participations do
        def visible
          ids = MeetingParticipation.
            select(:meeting_id).
            where(:user_id => proxy_owner.id, :visible => true).
            map{|p| p.meeting_id}
          proxy_target.where("id IN (?)", ids)
        end
      end
      ...
    end
    

    이게 도움이 되길 바란다.

  8. ==============================

    8.당신은 또한 할 수있다 :

    당신은 또한 할 수있다 :

    current_user.meeting_participations.visible.map(&:meeting)
    
  9. from https://stackoverflow.com/questions/5856838/scope-with-join-on-has-many-through-association by cc-by-sa and MIT license