2010-04-17 88 views
1

我試圖根據由ActionController before_filter確定的某些條件來設置默認範圍。在控制器:根據某些條件設置default_scope

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不被設置。你能否告訴我我做錯了什麼,如何解決這個問題,或者建議我採取其他方式來實現這一目標。

+1

你設置@default_scope_conditions - 這是一個實例變量從** **控制器和你期望從**模型**中讀取它。除非作爲方法參數傳遞,否則從模型中不可見。 – 2010-04-17 10:00:43

回答

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

嘗試一個default_scope並使用custome finder覆蓋它。

默認選項始終可以使用自定義查找器覆蓋。

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

User.all#將使用默認範圍 User.all(:爲了=> '名稱降序')#將使用順序選項傳遞。

那麼你可以嘗試像下面

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 

否檢查雖然。

+0

只是好奇這有什麼不對,讓我知道嗎? – Salil 2010-04-17 10:51:04