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
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 .... –
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. –
Die Verwendung einer abstrakten Klasse würde erfordern, dass alle meine Modelle die Klasse stattdessen erweitern, richtig? –