2009-06-08 57 views
1

在此花了一个工作日。无法从控制器重新加载ActiveRecord关联

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

我也有使用多个INSERT迅速做好自己的工作定制insert_new_usersassociate_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)”用于这个查询。

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

回答

3

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

无论换到在通话中users协会INSERT预引用uncached

self.class.uncached do 
    # ... 
end 

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

通过调用connection.clear_query_cache完成插入操作后,也可以清除缓存。

+0

不幸的是,它表示从模型内部调用未定义的方法'未缓存'。 – snitko 2009-06-09 01:07:38

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 
0

我已经能够只有这样,才能充分清除缓存调用reload。例如,你可以调用

User.reload

,并应强制缓存明确包括任何关系或关联。

相关问题