拥有大型模型堆栈并广泛使用玩偶缓存技术,最终会在模型更新后“触及”许多父模型。
在测试时,这似乎是在浪费时间,除非您尝试专门测试该功能。
有没有办法阻止模型与测试环境或测试级别touch
的关联?belongs_to
更新 1:
我对这个案子的第一次尝试是
# /config/initializers/extensions.rb
#
class ActiveRecord::Base
def self.without_touch_for_association(association_name, &block)
association_name = association_name.to_sym
association = self.reflect_on_all_associations(:belongs_to).select { |reflection| reflection.name == association_name }.first
options = association.options
association.instance_variable_set :@options, options.except(:touch)
yield
association.instance_variable_set :@options, options
end
end
Post.without_touch_for_association(:user) do
Post.last.save
end
当然,没有成功和省钱Post.last
还是碰它的User
。
更新理由:
我理解并同意这种方法可能是错误的来源,这根本不是一个好的做法。问题是我有一个包含大量集成和单元测试的巨大套件。娃娃缓存也深入模型树。每次查看日志时,我都会看到很大一部分与触摸相关的查询。我知道最好的方法是优化单元测试以添加更多的模拟和存根以及更少的持久性。在集成测试中解决问题更加困难。
无论如何,我问这个问题是为了学习和研究。我有兴趣探索这种技术的潜在速度改进。
解决方案:有关工作代码,请参阅下面我自己的答案。