2015-05-29 81 views
3

根据documentation for ActiveRecord::Associations::ClassMethods,ActiveRecord可以自动确定一个模块的关联是否与另一个模型的has_onehas_many关联相反。然而,我想确保这个检测实际上成功了一些我不确定的关联(例如,我有一个belongs_to,它不完全匹配其他模型的名称,但有class_name集合)。有没有办法检查inverse_of检测是否应用于特定关联?理想情况下,我会在项目的测试套件中添加一些内容以确保该关联是双向的。如何检查ActiveRecord的inverse_of检测是否有效?

+0

这不完全是你要求的,但你应该在关联上设置“:inverse”选项,而不是让Rails自动计算反比关系,如果你想在某处使用“反向”功能。 –

+0

@MaxWilliams不,你不应该。这是一个完美的配置惯例。我认为编写多余的代码不是rails的方式,即如果Rails> = 4.1的自动反转检测机制已经选择了它,那么写一个'inverse_of'选项是没有意义的。此外,我遇到的案例中有99%不是关于功能,而是性能提升,所以没有杠杆作用,仍然有优势。问题是关于是否很难确定是否已经检测到逆。 –

+0

我认为从可读性/自我记录代码的角度来看,它有很多意义:如果选项a)保证Rails能够做正确的事情,并且b)让同事明白某些不寻常的事情正在发生,那么什么是伤害? –

回答

4

启动轨道控制台,然后运行:

> Rails.application.eager_load! 

> ActiveRecord::Base.descendants.each {|m| puts "=== #{m} ==="; m.reflect_on_all_associations.each {|a| puts "#{a.name} => #{a.has_inverse?}"}} 

将倾倒在一个列表与所有的车型,它们的关联,如果知道它们的反,否则“假”,零或空字符串(基于为什么它是未知的。)