2016-08-16 2 views
1

사용자 관리에 사용하는 dashboard_controller가 있습니다. 여기 컨트롤러가 있습니다 :이 방법을 대체 할 적절한 범위는 무엇입니까?

class DashboardController < ApplicationController 
    before_action :authenticate_user! 

    def index 
    if current_user.admin? 
     @users = current_user.get_organization_users 
    else 

    flash[:notice] = "Unauthorized Page View" 
    redirect_to(tasks_url) 
    end 
end 

참고 저는 @users = current_user.get_organization_users입니다. 다음은 내 사용자 모델의 get_organization_users 메소드입니다.

def get_organization_users 
    self.organization.users 
end 

어떻게 이것을 범위로 바꿀 수 있습니까? 나는 시도했다 ...

scope :organization_users, -> { self.organization.users } 

... 그러나 worky. 어떤 도움을 주셔서 감사합니다.

+0

scope : organization_users, -> {organization.users}'해 보셨습니까? –

+3

왜'current_user.organization.users'를 사용하지 않을까요? –

답변

1

scopeclass method을 모델에 추가하는 데 사용됩니다. 하지만 instance에서 메소드를 호출하려고합니다. 따라서이 경우 instance method이 적합합니다.

그러나 범위를 만들려면 user_id을 매개 변수로 범위에 전달하십시오.

0

귀하의 질문에 대해 확실하지 않습니다. 현재 사용자와 관련된 조직에 속한 모든 사용자를 가져오고 싶습니다. 이 경우에는 current_user.organization.users으로 전화하면됩니다.

범위는 관계에있는 개체를 가져 오는 것이 아니라 현재 모델의 레코드를 필터링하는 데 사용됩니다. 공식 문서 (http://guides.rubyonrails.org/active_record_querying.html#scopes)에서 해당 내용을 읽을 수 있습니다.

1

내부적으로 활성 레코드 converts scopes into class methods.

즉, 인스턴스 메서드 get_organization_users을 범위로 바꿀 수 없으며 클래스의 인스턴스 인 current_user에서 호출 할 수 있습니다.

당신이 할 수있는 일은 스코프를 생성하고 인자 (아마도 사용자 ID)를 전달한 다음 그 스코프를 사용자 클래스에서 직접 호출하는 것입니다.

원하는 경우 예제를 제공 할 수 있지만이 접근 방식은 원하는 것보다 훨씬 길다고 생각합니다.

관련 문제