0

세 가지 다른 관계를 결합한 관계를 만들려고합니다. 처음 3 가지는 모두 같은 클래스이고, 나는 대기업이되고 싶습니다. 그러나 좋은 "arel"방법을 찾을 수는 없습니다.Ruby on Rails : 세 가지 다른 관계를 결합한 관계를 만듭니다.

다음은 내가하려는 일의 예입니다. 작동

SQL 쿼리는 물론

SELECT `records`.* FROM `records` INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4 

, 난 레일 방식으로 그렇게하고 싶다. 여기까지 내가 지금까지 가지고있는 것이있다. 그것은 꽤 자기 설명 적이어야합니다, 그래서 나는 그것을 더 설명하는 당신의 시간을 낭비하지 않을 것입니다.

class Group < ActiveRecord::Base 
    has_many :recorded_records, :through => :memberships, :source => :recorded_records, :class_name => "Record" 
    has_many :reported_records, :through => :memberships, :source => :reported_records, :class_name => "Record" 
    has_many :reviewed_records, :through => :memberships, :source => :reviewed_records, :class_name => "Record" 

    #has_many :records through recorded_records, reported_records, reviewed_records?? 
    # Psuedo code above... Wondering how best to do this. I've tried... 
    def records 
    recorded_records | reported_records | reviewed_records 
    end 

    # But that makes three seperate database queries when what I really want is... 
    # SELECT `records`.* FROM `records` INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4 

end 

여러분! 고마워 :)

+0

'회원'모델 콘텐츠를 표시 할 수 있습니까? –

답변

0
를 사용하는 몇 가지 예를 제공는 등의 매개 변수를 허용 할, 모델 내에서하는 방법으로이 문제를 추가 할 수 있습니다

이봐 요, 당신 도움에 많은 감사를드립니다, @ 리 푸크. 내 생각에 너는 약간의 생각을 자초했다. 내가 한 것은 select 문 밖으로보기 작성했다 :이보기 view_group_records 이름

AS SELECT 
    `records`.`id` AS `record_id`, 
    `memberships`.`group_id` AS `group_id` 
FROM (`records` join `memberships`) where ((`records`.`subject_membership_id` = `memberships`.`id`) or (`records`.`recorder_membership_id` = `memberships`.`id`) or (`records`.`subject_membership_id` = `memberships`.`id`)); 

을, 다음 (적절한 관계) GroupRecord라는 액티브 모델을 만들어 지금 내 그룹 모델에서, 나는 설정된 has_many과 GroupRecord의 관계는 has_many :records, :through => :group_records입니다.

이것은 제대로 작동하는 것 같습니다!

하지만 당신의 솔루션은 확실히 작동합니다.

2

사용자 정의 조인으로이 작업을 수행 할 수 있습니다. 위의 SQL을 사용 : 약간의 작업으로

Record.joins('INNER JOIN `memberships` ON `records`.`subject_membership_id` = `memberships`.`id` OR `records`.`recorder_membership_id` = `memberships`.`id` OR `records`.`subject_membership_id` = `memberships`.`id` WHERE `memberships`.`group_id` = 4') 

당신은

는 Railsguide here.join

+0

닫기! 당신은'Record.joins'을 의미합니다, 나는 이것을 발사 할 것이고 그것이 어떻게 작동하는지 볼 것입니다. 이런 관계를 맺을 방법이 없을까요? "OR"다중 외래 키? – Volte

+0

Doh! 내 대답이 업데이트되었습니다. 위와 같이 커스텀 조인을하지 않으면 레일스와 하나의 쿼리로 원하는 것을 할 수있는 방법을 알 수 없다. 그것은 Rails의 아름다움과 단점입니다 - 컨벤션 이상의 관습 : – DaveStephens

관련 문제