默认范围忽略条件中的动态值

时间:2012-10-01 02:58:08

标签: sql ruby-on-rails activerecord default-scope

在我的Activity模型中,我有一个默认范围:

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

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

答案 1 :(得分:1)

由于范围缓存正在发生,请尝试使用lambda:

进行封装
default_scope lambda { { :conditions => { :subject_id => Log.get_subject_id } } }