Question

J'essaie de définir un named_scope pour tous mes modèles dans une application Rails.

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

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

Je comprends que mon named_scope n’est probablement pas correct, mais je souhaite uniquement obtenir de l’aide pour la définition de named_scope. De plus, les GEM Ruby ACL ne m'intéressent pas pour le moment.

Dans les initialiseurs /:

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
Était-ce utile?

La solution

le has_many ne fonctionnera probablement pas car il est évalué dans le corps de la classe et que les clés étrangères attendues sont pour la classe dans laquelle elle a été évaluée plutôt que pour les classes héritées. (Par exemple, un modèle de blog avec id = 42 peut avoir de nombreux modèles de commentaire stockés avec blog_id = 42, les clés nécessaires à son fonctionnement sont basées sur le nom de la classe.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top