2009-06-25 13 views
1

J'essaie de définir un named_scope pour tous mes modèles dans une application Rails.Essayer de définir named_scopes et d'autres relations ActiveRecord sur tous les modèles

Actuellement, j'ai pu me rapprocher de cela en écrivant un initialiseur pour ActiveRecord :: Base et en y mettant des méthodes régulières. Bien sûr, cela n'offre pas de réel avantage quand il s'agit de créer des chaînes de requête et c'est probablement le moyen le moins efficace de faire le travail.

Cependant, cela ne fonctionne pas lorsque je commence à essayer d'utiliser les méthodes a_many, named_scope, etc ... ActiveRecord.

Bien que je comprenne que mon scope_scope n'est probablement pas correct, je veux seulement de l'aide pour obtenir le named_scope défini. De plus, je ne suis pas intéressé par les GEM Ruby ACL actuellement.

Dans initializers /:

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 

Répondre

1

le has_many ne fonctionneront probablement pas parce qu'il est évalué dans le corps de la classe et les clés étrangères attendues sont de la classe dans laquelle il a été évalué plutôt que les classes héritant. (par exemple, le modèle de blog avec id = 42 peut avoir plusieurs modèles de commentaire stockés avec blog_id = 42, les clés nécessaires pour le faire fonctionner sont basées sur le nom de classe)

La portée nommée devrait fonctionner si elle est correcte.

La méthode héritée devrait fonctionner.

+0

Existe-t-il une méthode alternative que je peux utiliser pour ajouter named_scopes à tous les modèles de mon application? Normalement, je suis d'accord avec les méthodes, mais elles ne peuvent pas participer à une chaîne de la manière d'un named_scope. Il y a aussi beaucoup plus d'activité de requête et de surcharge dans l'utilisation d'une méthode simple .... –

+0

définir des étendues nommées comme vous le faites, cela fonctionne dans mon application. alternativement, vous pouvez utiliser l'héritage régulier en utilisant une classe active d'enableecord comme http://www.harukizaemon.com/2006/10/abstract-activerecord-classes-by.html. Pour obtenir le has_many, etc. vous devrez probablement ajouter un appel de méthode (soit avec de nombreuses fonctions personnalisées) au corps de la classe de chaque modèle. –

+0

Utiliser une classe abstraite nécessiterait que tous mes modèles étendent cette classe à la place, n'est-ce pas? –