1

Ich versuche, ein named_scope für alle meine Modelle in einer Rails-Anwendung zu definieren.Versuchen, named_scopes und andere ActiveRecord-Beziehungen auf allen Modellen zu definieren

Jetzt konnte ich in die Nähe kommen, indem ich einen Initialisierer für ActiveRecord :: Base schrieb und reguläre Methoden einführte. Natürlich bietet dies keinen wirklichen Vorteil, wenn es darum geht, Abfrageketten zu erstellen, und es ist wahrscheinlich die am wenigsten funktionierende Methode, die Aufgabe zu erledigen.

Allerdings funktioniert es nicht, wenn ich versuche, die ActiveRecord-Methoden has_many, named_scope, etc ... zu verwenden.

Während ich verstehe, dass mein named_scope wahrscheinlich nicht korrekt ist, möchte ich wirklich nur helfen, das named_scope definiert zu bekommen. Außerdem bin ich derzeit an keinen Ruby ACL GEMs interessiert.

In 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 

Antwort

1

die has_many funktioniert wahrscheinlich nicht, weil es in der Klasse Körper und die erwarteten Fremdschlüssel sind für die Klasse, in der sie eher als die Vererbungsklassen ausgewertet wurde ausgewertet. (z. B. Blog-Modell mit id = 42 kann viele Kommentarmodelle mit blog_id = 42 gespeichert haben, die Schlüssel, die erforderlich sind, damit es funktioniert, basieren auf dem Klassennamen)

Der angegebene Bereich sollte funktionieren, wenn er korrekt ist.

Die geerbte Methode sollte funktionieren.

+0

Gibt es eine alternative Methode, mit der ich named_scopes allen Modellen in meiner App hinzufügen kann? Normalerweise bin ich mit den Methoden einverstanden, aber dann können sie nicht an einer Kette teilnehmen, wie es ein named_scope könnte. Es gibt auch viel mehr Abfrageaktivität und Aufwand bei der Verwendung einer einfachen Methode .... –

+0

Definiere benannte Bereiche, wie Sie es tun, es funktioniert in meiner Anwendung. alternativ können Sie die reguläre Vererbung mit einer abstrakten ActiveRecord-Klasse wie http://www.harukizemon.com/2006/10/abstract-activerecord-classes-by.html verwenden. Um die has_many usw. zu erhalten, müssen Sie wahrscheinlich einen Methodenaufruf (entweder mit vielen oder mit einer benutzerdefinierten Funktion) zum Klassenkörper jedes Modells hinzufügen. –

+0

Die Verwendung einer abstrakten Klasse würde erfordern, dass alle meine Modelle die Klasse stattdessen erweitern, richtig? –