0

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

default_scope where(:subject_id => Log.get_subject_id)

问题出在 Log.get_subject_id 中,默认值为 0。这是我的 Log 模型:

@@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

哪里有问题?谢谢!

4

2 回答 2

2

使用这种形式default_scope,您的Log.get_subject_id调用将在解析类时进行评估,因此您实际上是在说这样的话:

default_scope where(:subject_id => 0)

但是,您可以使用块 withdefault_scope来延迟范围的评估,直到您尝试使用它,并且可能Log.get_subject_id会有一个有用的值:

default_scope { where(:subject_id => Log.get_subject_id) }
于 2012-10-01T03:04:59.253 回答
1

这是由于范围缓存而发生的,请尝试用 lambda 包装它:

default_scope lambda { { :conditions => { :subject_id => Log.get_subject_id } } }
于 2012-10-01T03:02:55.787 回答