拥有大型模型堆栈并广泛使用娃娃缓存技术,最终会在模型更新后“触及”许多父模型。
在测试时,这似乎是浪费时间,除非您尝试专门测试该功能。
有没有办法防止模型touch
their 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
.
更新理由:
我理解并同意这种方法可能是错误的来源,而且根本不是一个好的做法。问题是我有一个巨大的套件,其中包含大量集成和单元测试。玩偶缓存也深入到模型树中。每次我查看日志时,我都会看到很大一部分与触摸相关的查询。我知道最好的方法是优化单元测试以添加更多的模拟和存根以及更少的持久性。在集成测试中解决问题更加困难。
无论如何,我问这个问题是为了学习和研究。我有兴趣探索这项技术的潜在速度改进。
解决方案:有关工作代码,请参阅下面我自己的答案。
假设您使用的是 Rails 4.1.4 或更高版本:
User.no_touching do
Post.last.save
end
or even
ActiveRecord::Base.no_touching do
Post.last.save
end
See ActiveRecord::NoTouching http://api.rubyonrails.org/classes/ActiveRecord/NoTouching/ClassMethods.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)