1

레일즈 애플리케이션에서 모든 모델에 대해 named_scope을 정의하려고합니다.모든 모델에서 named_scopes와 다른 ActiveRecord 관계를 정의하려고 시도합니다.

현재 ActiveRecord :: Base 용 이니셜 라이저를 작성하고 거기에 일반 메소드를 넣음으로써이 문제를 해결할 수있었습니다. 물론 이것은 쿼리 체인을 만드는 데있어 실질적인 이점을 제공하지 않으며 아마도 작업을 완료하는 데 필요한 최소한의 수단 일 것입니다.

그러나 has_many, named_scope 등을 사용하려고 할 때 작동하지 않습니다. ActiveRecord 메소드.

named_scope가 정확하지 않을 수도 있음을 이해하지만 실제로 named_scope을 정의하는 데 도움이 필요합니다. 또한 현재 Ruby ACL GEM에 관심이 없습니다.

에서 초기화/:

class ActiveRecord::Base 

    has_many(:permissions) 
    named_scope(:acl_check, lambda do |user_id, method| 
     { 
      :include => :permission, 
      :conditions => [ 
       ["permissions.user_id=?", user_id], 
       ["permissions.method=?", method], 
       ["permissions.classname=?", self.class.name] 
      ] 
     } 
    end) 

    # Conducts a permission check for the current instance. 
    def check_acl?(user_id, method) 

     # Perform the permission check by User. 
     permission_check = Permission.find_by_user_id_and_instance_id_and_classname_and_method(user_id, self.id, self.class.name, method) 
     if(permission_check) 
      # If the row exists, we generate a hit. 
      return(true) 
     end 

     # Perform the permission check by Role. 

     # Otherwise, the permissions check was a miss. 
     return(false) 

    end 

end 

답변

1

이 클래스 본문에서 평가 및 예상되는 외국 키가 상속하는 클래스보다는 평가 된 클래스위한 때문에 has_many 가능성이 작동하지 않습니다. (예 : id = 42 인 블로그 모델은 blog_id = 42로 저장된 많은 모델을 가질 수 있습니다. 작동시키기 위해 필요한 키는 클래스 이름을 기반으로합니다.)

명명 된 범위가 맞으면 올바르게 작동합니다.

상속 된 메서드가 작동해야합니다.

+0

내 앱의 모든 모델에 named_scopes를 추가하는 데 사용할 수있는 대체 방법이 있습니까? 일반적으로 메소드는 괜찮습니다.하지만 named_scope가 할 수있는 방식으로 체인에 참여할 수는 없습니다. 또한 간단한 메서드를 사용하여 더 많은 쿼리 활동과 오버 헤드가 있습니다. –

+0

당신이하고있는 것처럼 명명 된 범위를 정의하면 내 응용 프로그램에서 작동합니다. 또는 http://www.harukizaemon.com/2006/10/abstract-activerecord-classes-by.html과 같은 추상 activerecord 클래스를 사용하여 정규 상속을 사용할 수 있습니다. has_many 등을 얻으려면 각 모델의 클래스 몸체에 메서드 호출 (많은 함수 또는 사용자 정의 함수가 있음)을 추가해야합니다. –

+0

추상 클래스를 사용하면 모든 모델에서 대신 THAT 클래스를 확장해야합니다. –