在这上面度过了一个工作日。
我有
class Box
has_many :users, :through => :subscriptions
end
我还有自定义insert_new_users
和associate_with(new_users)
方法,这些方法使用多个INSERT来快速完成工作。无论如何,他们工作正常。我在“associate_with”方法的末尾也有这一行:
def associate_with
# mysql INSERT here
self.users(true) # Should force reload
end
在测试环境(控制器和模型测试)中运行时,它按预期工作,如果我删除强制重新加载的true
参数,它会按预期失败。如果我script/console
模型,它也可以从update_attributes
开发。但是当我从控制器尝试update_attributes
时,开发或生产失败了。它只是不重新加载关联,我可以在日志中看到它,它为此查询显示“CACHE(0.0ms)”。
奇怪的是 - 它之前有效,我无法确定它因某些原因停止工作的那一刻。我希望也许有人知道这是怎么可能的。
答案 0 :(得分:3)
您正在看到ActiveRecord SQL查询缓存的效果。
在users
uncached
关联
self.class.uncached do
# ...
end
这将阻止ActiveRecord缓存块内任何查询的结果。如果您在许多地方都有代码,这可能很烦人。
您也可以在完成插入后通过调用connection.clear_query_cache
来清除缓存。
答案 1 :(得分:0)
到目前为止,我已经能够通过以下方式欺骗AR:
def associate_with
# mysql INSERT here
@users = self.users.find(:all, :conditions => ['users.id IS NOT NULL'])
end
def users
@users || self.users
end
答案 2 :(得分:0)
我能够完全清除缓存的唯一方法是调用reload
。例如,您可以致电
User.reload
它应该强制缓存清除,包括任何关系或关联。