2012-10-01 53 views
0

動態值在我的活動模式,我有一個默認範圍:默認範圍忽略條件

default_scope where(:subject_id => Log.get_subject_id) 

問題是在Log.get_subject_id,默認值是0。這是我的登錄模式:

@@subject_id = 0 
def self.set_subject_id(val) 
    @@subject_id = val 
end 
def self.get_subject_id 
    @@subject_id 
end 

當我通過控制器中的Log.set_subject_id(10)更改@@ subject_id的值,然後嘗試Activity.all時,它總是給我帶來不好的結果。 SQL:

SELECT "activities".* FROM "activities" WHERE "activities"."subject_id" = 0 

問題在哪裏?謝謝!

回答

2

與形成的default_scope,上課的時候被解析,那麼你真的說什麼你Log.get_subject_id的通話將被評估像這樣:

default_scope where(:subject_id => 0) 

但是,您可以使用塊與default_scope延遲範圍的評估,直到您嘗試使用它,以及是否可能Log.get_subject_id將有一個有用的值:

default_scope { where(:subject_id => Log.get_subject_id) } 
+0

了不起的工作,非常感謝你,你救了我! –

1

這是因爲範圍的緩存發生,嘗試拉姆達包木窗它:

default_scope lambda { { :conditions => { :subject_id => Log.get_subject_id } } } 
+0

你實際上不需要'lambda',只是一個普通的塊就可以做到這一點。 –

+0

不知道,謝謝 – iouri

+0

因爲原來的問題是rails 3語法,所以我更喜歡@mu所示的結果太短 – DGM