无法从控制器重新加载ActiveRecord关联

时间:2009-06-08 17:29:16

标签: ruby-on-rails associations reload

在这上面度过了一个工作日。

我有

class Box
  has_many :users, :through => :subscriptions
end

我还有自定义insert_new_usersassociate_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)”。

奇怪的是 - 它之前有效,我无法确定它因某些原因停止工作的那一刻。我希望也许有人知道这是怎么可能的。

3 个答案:

答案 0 :(得分:3)

您正在看到ActiveRecord SQL查询缓存的效果。

users

的调用中将INSERT之前的引用包装到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

它应该强制缓存清除,包括任何关系或关联。