4

내 앱은 사용자뿐만 아니라 Admins 및 SuperAdmins도 가지고 있습니다. 세 가지 모두 동일한 속성을 공유하기 때문에 내가 "사용자", "관리자"또는 "super_admin"이 될 수 있습니다 추가 속성 "역할"을 하나 개의 테이블을 사용하고 싶습니다 :레일즈 : ActiveRecord의 default_scope 및 클래스 상속

class User < ActiveRecord::Base 
# with nickname and password 
end 


class Admin < User 

    def power 
    puts "admin rights" 
    end 
end 


class SuperAdmin < Admin 

    def superpower 
    puts "I've got the #{power}!" 
    end 
end 

지금은 원하는 SuperAdmins 만 얻으려면 SuperAdmin.all과 같은 것을하십시오. default_scope를 사용하여이 날 ​​잡으려고 것 같다

class SuperAdmin < Admin 
    default_scope where(["role = ?", "super_admin"]) 

    # ... 
end 

는 지금은 너무 관리자에게 default_scope을 추가 해요 :

class Admin < User 
    default_scope where(["role = ?", "admin"]) 

    # ... 
end 

Aaaand ... SuperAdmin.all 더 이상 아무 것도 반환하지 않습니다. 왜 그런가요?

답변

7

default_scope가 두 개 이상인 경우 ActiveRecord가이를 연결합니다. 따라서 SuperAdmin.all은 절대 "Admin"및 "SuperAdmin"역할을 가진 사용자를 찾습니다.

그래서 그냥 혼자서 self.default_scope을 정의, 당신은 상속 모델의 default_scope을 덮어 쓸 수 있다는 해결하기 위해 지금 예상대로

class SuperAdmin < Admin 
    def self.default_scope 
     where(["role = ?", "super_admin"]) 
    end 
    #... 
end 

SuperAdmin.all 작동합니다.

1

나를 좋아하는 사람이라면 다른 옵션 (더 나은 이미지)이 있습니다.

배열로 정의 된 default_scopes을 모두 제거하면됩니다.

class Admin < User 
    # This line will clear all the default_scopes defined in parent classes 
    self.default_scopes = [] 
    default_scope { ... } 
end 

여기 https://apidock.com/rails/ActiveRecord/Base/default_scope/class 소스 코드를 참조하십시오. 배열에 후속 기본 범위를 추가하는 것만 볼 수 있습니다.

self.default_scopes = default_scopes + [scope]