1

我正在尝试根据 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

但这似乎不起作用,调用了 before 过滤器但未设置 default_scope 。您能否告诉我我做错了什么以及如何解决它或建议我其他一些方法来实现它。

4

2 回答 2

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
于 2010-04-17T10:23:58.987 回答
-1

尝试一个 default_scope 并使用客户查找器覆盖它。

始终可以使用自定义查找器覆盖默认选项。

class User < ActiveRecord::Base
  default_scope :order => '`users`.name asc'
end

User.all # 将使用默认范围 User.all(:order => '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

虽然没有检查。

于 2010-04-17T10:20:33.813 回答