Vom Besitzer gefilterte Modellobjekte auf Rails 3
-
12-12-2019 - |
Frage
Ich muss meine ActiveRecord-Modelle etwas filtern. Ich möchte alle meine Modellobjekte nach Eigentümer-ID filtern.Was ich brauche, ist im Grunde der default_scope für ActiveRecord.
Ich muss jedoch nach einer Sitzungsvariablen filtern, auf die vom Modell aus nicht zugegriffen werden kann.Ich habe gelesen einige Lösungen, aber keiner funktioniert, im Grunde sagt jeder von ihnen, dass Sie session verwenden können, wenn Sie default_scope deklarieren.
Dies ist meine Erklärung für den Geltungsbereich:
class MyModel < ActiveRecord::Base
default_scope { where(:owner_id => session[:user_id]) }
...
end
Ganz einfach, oder?Aber das kann man nicht sagen Methodensitzung existiert nicht.
Ich hoffe, Sie können helfen
Lösung
Sitzungsobjekte im Modell gelten als schlechte Praxis. Stattdessen sollten Sie ein Klassenattribut hinzufügen User
Klasse, die Sie in einer festlegen around_filter
in deinem ApplicationController
, basierend auf dem aktuellen_Benutzer
class User < ActiveRecord::Base
#same as below, but not thread safe
cattr_accessible :current_id
#OR
#this is thread safe
def self.current_id=(id)
Thread.current[:client_id] = id
end
def self.current_id
Thread.current[:client_id]
end
end
und in deinem ApplicationController
Tun:
class ApplicationController < ActionController::Base
around_filter :scope_current_user
def :scope_current_user
User.current_id = current_user.id
yield
ensure
#avoids issues when an exception is raised, to clear the current_id
User.current_id = nil
end
end
Und jetzt in deinem MyModel
Sie können Folgendes tun:
default_scope where( owner_id: User.current_id ) #notice you access the current_id as a class attribute
Andere Tipps
Sie können dies nicht in ein Default_scope integrieren.Dies würde jede Verwendung innerhalb von (z. B.) der Konsole, da es keine Sitzung gibt.
was Sie tun könnten: Fügen Sie eine Methode hinzu: Fügen Sie Ihren ApplicationController so hinzu generasacodicetagpre.
Diese Methode bringt jedenfalls einen Umfang zurück.
Filterung mit Sitzung ist eine UI-Task, sodass er seinen Platz in der Steuerung hat.(Die Modellklassen haben keinen Zugriff auf den Anforderungszyklus, Session, Cookies usw..
was Sie wollen, ist generasacodicetagpre.
Da die Filterung des Besitzes an der aktuellen Benutzer ein typisches Szenario ist, könnten Sie vielleicht in Betracht ziehen, Standardlösungen wie Suche "Cancan Edelle, Accessible_by"
Seien Sie auch der Übel von Default_Scope bewusst. rails3 Default_Scope und Standardspalte in der Migration