2013-10-23 5 views
5

저는 ROR에 익숙하지 않아 범위를 이해하려고합니다. 현재 구현에서는 모든 프로세서를 가져와보기에 표시하고 있습니다.범위를 사용하여 여러 테이블에 조인하는 방법

class ProcessorsController 
    def index 
    @processors = Processor.all  
    end 
end 

나는이 그래서 사용자가을 관리자에 경우에만 프로세서를 얻을 수 있습니다 수정할. 이것은 나의 관계가 설정되는 방법이다.

class Processor 
    belongs_to :feed 

    #SCOPES (what I have done so far) 
    scope :feed, joins(:feed) 
    scope :groups, joins(:feed => :groups).join(:user).where(:admin => true) 
end 

class Feed < ActiveRecord::Base 
    has_and_belongs_to_many :groups 
end 

class Group < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :groups 
    scope :admin,  where(:admin  => true) 
end 

나는 나의 놀리려는에서

pry(main)> Processor.find(63).feed.groups.first.user.admin? 

PS를이 작업을 수행 할 수 있었다 : 누군가가 나는 관계가 복잡한 경우 범위를 사용하는 방법을 배울 수있는 좋은 자원을 제공 할 수있다.

답변

8
scope :with_admin, -> { joins(:feed => { :groups => :user }).where('users.admin' => true) } 

, 당신은 official documentation on ActiveRecord joins 겪었을?

+0

고마워요. 예, 나는 그 문서를 철저히 조사했지만 여러 조인을 사용하지 않았습니다. –

+0

당신의 대답은 스코프 내부에서 조인을 사용하는 방법에 대해 정말로 설명해주었습니다. 그것은 단지 동일합니다. 메서드를 호출하기 전에 모델 이름 부분을 '생략'해야합니다. – Francisco

1

당신이 범위를 필요가 없습니다 ... 당신은 사용자가 관계와 조건을 사용하여 관리자입니다 만 프로세서를 얻을 수있는 자원에 관해서는

class Feed < ActiveRecord::Base 
    ... 
    has_one :user, through: :groups 
end 


class Processor 
    ... 
    has_one :admin, through: :feed, source: :user, conditions: ['users.admin = 1'] 
end 
+0

이해가 안됩니다, 제 관계를 수정 하시겠습니까? 기존 관계를 유지하려면 어떻게해야합니까? –

+0

당신은 당신의 것을 수정하지 않고 제안 된 두 개의 관계를 안전하게 덧붙일 수 있습니다. – okliv

관련 문제