2012-10-01 55 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