我一直在阅读有关inverse_of的文章,我在网上看到的所有内容似乎都不一致,让我感到困惑。如果你看here,就可以看到
inverse_of支持有一些限制:
- 他们不使用:通过协会。
- 他们不兼容:多态关联。
- 他们不能与:作为协会。
- 对于belongs_to关联,忽略has_many反向关联。
在上面,他们给出了这个例子
class Customer < ActiveRecord::Base
has_many :orders, :inverse_of => :customer
end
class Order < ActiveRecord::Base
belongs_to :customer, :inverse_of => :orders
end
我认为他们说的是第一个inverse_of什么都不做,但是如果是这样的话他们为什么这么做呢?
此外,即使上述内容表示inverse_of不适用于通过关联,this page说
如果您在联接模型上使用belongs_to,最好在belongs_to上设置:inverse_of&gt;选项,这意味着以下示例在&gt;标记为has_many的情况下正常工作:通过关联):
并给出了这个例子
@post = Post.first
@tag = @post.tags.build :name => "ruby"
@tag.save
最后一行应该保存通过记录(一个Taggable)。这仅在设置了&gt;:inverse_of时才有效:
class Taggable < ActiveRecord::Base
belongs_to :post
belongs_to :tag, :inverse_of => :taggings
end
对我来说,这一切似乎都是不一致和高度混乱的。但总的来说,我认为对每一种关系都说反向都没有害处。那是问题吗?我见过很多人在SO上问这个问题,并没有看到任何人的肯定是或否。
答案 0 :(得分:1)
总是指定它没有任何缺点,它将允许rails优化对象的加载,这样你就可以在两个方向上上下移动一个活动的记录模型关系链,而不会在一个对象上改变值的奇怪错误改变它的参考。
将它设置在不起作用的唯一问题是如前所述的某些类型,如果它们无声地失败,如果你在改变某些东西之后在方法链上走错路,那么你将会得到提醒错误
这是来自rails API
d = Dungeon.first
t = d.traps.first
d.level == t.dungeon.level # => true
d.level = 10
d.level == t.dungeon.level # => false
上面示例中的Dungeon实例d和t.dungeon引用了来自数据库的相同对象数据,但实际上是该数据的内存中副本。在关联上指定:inverse_of选项可以告诉Active Record关于反向关系,它将优化对象加载。