带有ActiveRecord的rails 3中inverse_of的限制是什么

时间:2013-04-18 07:21:16

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord

我一直在阅读有关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上问这个问题,并没有看到任何人的肯定是或否。

1 个答案:

答案 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关于反向关系,它将优化对象加载。