Es gibt einen effizienten Weg: stellen Sie sicher, dass Sie nur eine Abfrage ausführen, und dass die von Ihnen ausgeführte Abfrage genau die gewünschten Objekte zurückgibt. Leichter gesagt als getan, natürlich.
Eine Möglichkeit, dies zu handhaben, besteht darin, Ihre Bedingungen mithilfe von Bereichen zu erstellen.
@posts = @thread.posts.not_deleted.this_week.not_secret
Wenn alle diese Methoden Bereiche sind, wird dies nur eine Abfrage sein.
Wenn Ihre Bedingungen zu komplex sind, um sie leicht zu Bereichen zu machen, sollten Sie wahrscheinlich einfach eine Methode schreiben, um die sichtbaren Objekte für den Benutzer zurückzugeben.
class User
def posts_for(thread)
if is_admin?
thread.posts
elsif thread.owner == self
thread.posts.not_deleted
else
Post.find(:all, :conditions => something_complicated(thread, self))
end
end
end
Meine Anwendung hat viele Arten von Objekten und sehr komplizierter Berechtigungen, so dass wir erfassen Anrufe wie das mit method_missing, und sie an eine Erlaubnis Bibliothek, die weiß, wie man all die verschiedenen Anfragen zu machen.
Nun, ich benutze das Rails-Acl-Plugin, das ziemlich prägnant ist, aber ich glaube nicht, dass ich es in Ketten verwenden kann, kann ich? Gibt es ACL-Plugins, die sich fast wie eine Erweiterung von ActiveRecord verhalten? Die Dokumentation für Schienen acl gibt eine Menge zu beginnen, aber die Durchführung von Sicherheitskontrollen lässt mich mit viel Rätselraten. Vielen Dank für Ihre Hilfe, wirklich gute Tipps hier schon! –
Ich bin mir nicht sicher, welche Bibliothek Sie verwenden, vielleicht verknüpfen Sie sie? Ich kenne den Bereich der Berechtigungsbibliotheken nicht wirklich. Ich habe meine eigene Berechtigungsbibliothek gerollt, weil unsere Rollen auf Granularität auf Objektebene und nicht auf Granularität auf Anwendungsebene basieren. Daher funktionierten die Plugins nicht wirklich für mich. –
Haben Sie sich rails_acl_plugin angesehen? Es tut Instanz, Klasse und Methode Berechtigungen. –