레일즈 애플리케이션에서 모든 모델에 대해 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
내 앱의 모든 모델에 named_scopes를 추가하는 데 사용할 수있는 대체 방법이 있습니까? 일반적으로 메소드는 괜찮습니다.하지만 named_scope가 할 수있는 방식으로 체인에 참여할 수는 없습니다. 또한 간단한 메서드를 사용하여 더 많은 쿼리 활동과 오버 헤드가 있습니다. –
당신이하고있는 것처럼 명명 된 범위를 정의하면 내 응용 프로그램에서 작동합니다. 또는 http://www.harukizaemon.com/2006/10/abstract-activerecord-classes-by.html과 같은 추상 activerecord 클래스를 사용하여 정규 상속을 사용할 수 있습니다. has_many 등을 얻으려면 각 모델의 클래스 몸체에 메서드 호출 (많은 함수 또는 사용자 정의 함수가 있음)을 추가해야합니다. –
추상 클래스를 사용하면 모든 모델에서 대신 THAT 클래스를 확장해야합니다. –