Einstellen default_scope nach einigen Kriterien
-
27-09-2019 - |
Frage
Ich versuche, Satz Standardbereich nach einigen festgelegten Kriterien von ana Action before_filter. Im Controller:
before_filter :authorize
...
def authorize
if some_condition
@default_scope_conditions = something
elsif another_condition
@default_scope_conditions = something_else
end
end
Im Innern des Active
default_scope :conditions => @default_scope_conditions
Aber es scheint nicht zu arbeiten, werden die vor-Filter genannt, aber die default_scope nicht gesetzt bekommen. Könnten Sie mir bitte raten, was ich falsch mache und wie man es beheben oder empfehlen Sie mir eine andere Art und Weise, dies zu erreichen.
Lösung
Sie setzen @default_scope_conditions - das ist eine Instanz-Variable aus dem Controller und Sie erwarten, dass es aus dem Modell lesen . Es ist nicht sichtbar aus dem Modell, es sei denn als Methodenparameter übergeben.
Mehr, dieser Ansatz würde das MVC-Prinzip durchbrechen, die die Modelllogik von der Steuerungslogik trennt. Ihr Modell sollte nicht automatisch Zugriff Informationen über den aktuellen Zustand des Controllers
Was Sie tun können: verwenden anonyme Bereiche
. def scope_user
if some_condition
@default_scope_conditions = something
elsif another_condition
@default_scope_conditions = something_else
end
@user_scoped = User.scoped(:conditions => @default_scope_conditions)
end
Dann in Ihrer Methode können Sie:
def my_method
users = @user_scoped.all
end
oder
def my_method
User.with_scope(:conditions => @default_scope_conditions) do
# ..
@users = User.all #users get scoped
@products.users # also gets scoped
end
end
Andere Tipps
Versuchen Sie eine default_scope und außer Kraft setzen es custome Finder verwendet wird.
Die Standardoptionen können immer einen benutzerdefinierten finder außer Kraft gesetzt werden.
class User < ActiveRecord::Base
default_scope :order => '`users`.name asc'
end
User.all # wird Standardbereich verwenden User.all. (: Order => 'name desc') # wird in der Reihenfolge Option übergeben verwenden
Dann können Sie versuchen, so etwas wie folgt
before_filter :authorize
...
def authorize
if some_condition
@order = '' # default scope
elsif another_condition
@order = something_else
end
end
def method_name
User.all(:order => @order)
end
Nein Prüfen though.