我正在尝试根据ana ActionController before_filter确定的某些条件设置默认范围。在控制器中:
before_filter :authorize
...
def authorize
if some_condition
@default_scope_conditions = something
elsif another_condition
@default_scope_conditions = something_else
end
end
在ActiveRecord中
default_scope :conditions => @default_scope_conditions
但它似乎不起作用,之前的过滤器被调用,但default_scope没有设置。你能否告诉我我做错了什么以及如何解决它或建议我实现其他方法。
答案 0 :(得分:1)
您设置 @default_scope_conditions - 这是控制器中的实例变量,您希望从模型中读取它。除非作为方法参数传递,否则从模型中看不到它。
此外,这种方法将破坏将模型逻辑与控制器逻辑分开的MVC原则:您的模型不应自动访问有关控制器当前状态的信息。
您可以做什么:使用匿名范围。
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
然后,在您的方法中,您可以:
def my_method
users = @user_scoped.all
end
或
def my_method
User.with_scope(:conditions => @default_scope_conditions) do
# ..
@users = User.all #users get scoped
@products.users # also gets scoped
end
end
答案 1 :(得分:-1)
尝试使用一个default_scope并使用个人查找器覆盖它。
使用自定义查找程序始终可以覆盖默认选项。
class User < ActiveRecord::Base
default_scope :order => '`users`.name asc'
end
User.all#将使用默认范围 User.all(:order =&gt;'name desc')#将使用传递顺序选项。
然后你可以尝试类似下面的内容
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
不检查。