1

为此花了一个工作日。

我有

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

我也有使用多个 INSERT 快速完成工作的自定义insert_new_users和方法。associate_with(new_users)无论如何,他们工作得很好。我在“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)”。

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

4

3 回答 3

3

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

users在调用中包装对关联的 pre-INSERT 引用uncached

self.class.uncached do
  # ...
end

这将阻止 ActiveRecord 缓存块内的任何查询的结果。如果你在很多地方都有代码,这可能很烦人。

您还可以在完成插入后通过调用清除缓存connection.clear_query_cache

于 2009-06-09T00:44:02.853 回答
0

我能够完全清除缓存的唯一方法是调用reload. 例如,您可以调用

User.reload

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

于 2014-04-14T22:21:28.070 回答
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
于 2009-06-09T01:25:55.203 回答