[RUBY-ON-RAILS] has_many :와 범위에 가입 협회를 통해
RUBY-ON-RAILShas_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.이 문제에 대한 내 솔루션입니다 :
이 문제에 대한 내 솔루션입니다 :
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.레일 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.
current_user.meetings.merge(MeetingParticipations.visible)
-
==============================
4.그것을 할 수있는 깨끗하고 협회의 방법입니다 :
그것을 할 수있는 깨끗하고 협회의 방법입니다 :
has_many :visible_meetings, -> { merge(MeetingParticipations.visible) }, :source => :meeting, :through => :meeting_participations
더 일반적인 용어에 넣어하려면, 당신은 당신이 범위를 병합을 통해 범위 중간 (통해) 연결을 할 수있는 체인으로 연결된 has_many 협회가있는 경우. 아마 레일 4+가 필요합니다.
그렇지 않으면이 @ 폴 Pettengill의 대답에서 볼로 (아마 원하지 않는) 중간 범위의 연결을 생성을 통해 수행되어야 할 것이다.
-
==============================
5.여기에 하나의 라이너입니다 :
여기에 하나의 라이너입니다 :
Meeting.joins(:meeting_participations).where(meeting_participation: { hidden: false, user_id: current_user.id })
당신이 그것의, 그것의 기능을 범위를 만들거나 단순히 어디서든 호출 할 수 있기 때문에 아주 좋습니다. 당신은 또한 당신이 해시 원하는 더 이상 제한을 추가 할 수 있습니다.
-
==============================
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.당신의 목적을 위해 회의의 범위를 사용하는 분별없는 것을 나에게 보인다. 회의 자체는 가시성이 없습니다, 그러나 참여 있습니다. 그래서 사용자 내에서 협회에 확장을 건의 할 것입니다 :
당신의 목적을 위해 회의의 범위를 사용하는 분별없는 것을 나에게 보인다. 회의 자체는 가시성이 없습니다, 그러나 참여 있습니다. 그래서 사용자 내에서 협회에 확장을 건의 할 것입니다 :
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.당신은 또한 할 수있다 :
당신은 또한 할 수있다 :
current_user.meeting_participations.visible.map(&:meeting)
from https://stackoverflow.com/questions/5856838/scope-with-join-on-has-many-through-association by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 어떻게 어떤 데이터베이스와 루비 온 레일즈를 구성? (0) | 2020.02.22 |
---|---|
[RUBY-ON-RAILS] 아마존 S3에서 파일을 다운로드 send_file 사용하십니까? (0) | 2020.02.22 |
[RUBY-ON-RAILS] 백엔드 웹 소켓 서버의 역방향 프록시로 사용할 수 nginx를 수 있습니까? (0) | 2020.02.22 |
[RUBY-ON-RAILS] 쿼리 문자열 매개 변수를 사용하여 액션 캐싱 레일 (0) | 2020.02.22 |
[RUBY-ON-RAILS] 레일 및 사용하여 API에 POST JSON HTTParty (0) | 2020.02.22 |