根据某些条件设置default_scope

时间:2010-04-17 09:35:04

标签: ruby-on-rails default-scope

我正在尝试根据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没有设置。你能否告诉我我做错了什么以及如何解决它或建议我实现其他方法。

2 个答案:

答案 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

不检查。