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

問題はどこにありますか?ありがとう!

4

2 に答える 2

2

その形式のdefault_scopeではLog.get_subject_id、クラスが解析されるときに呼び出しが評価されるため、実際には次のようなことを言っています。

default_scope where(:subject_id => 0)

ただし、 with ブロックを使用してdefault_scope、スコープの評価を使用しようとするまで遅らせることができ、おそらくLog.get_subject_id有用な値が得られます。

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

スコープのキャッシュが原因で発生しています。ラムダでラップしてみてください。

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