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

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top