14

如此处所述:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

inverse_of 似乎告诉 Rails 缓存内存中的关联并最小化数据库查询。他们的例子是:

 class Dungeon < ActiveRecord::Base
   has_many :traps, :inverse_of => :dungeon
   has_one :evil_wizard, :inverse_of => :dungeon
 end

 class Trap < ActiveRecord::Base
   belongs_to :dungeon, :inverse_of => :traps
 end

他们立即跟进:

 for `belongs_to` associations `has_many` inverse associations are ignored.

所以我有几个问题。

  1. has_many对于 a是否忽略逆关联belongs_to?如果是这样,他们的例子有什么意义?它不应该什么都不做吗?
  2. 据我所知(假设它做任何事情)所有这些允许做的事情是:

    dungeon.traps.first.dungeon
    

    最后调用.dungeon不生成一个全新的查询,而只是达到内存中的关联。假设这是正确的,我为什么不想要这种行为?为什么我不坚持inverse_of:每一个协会?

4

2 回答 2

6

我开始写有关 rails 变形器的文章,以及当关联不是模型的直接变形时,您如何使用 inverse_of 来指示它是什么。但后来我滚动到你提到的部分,这就是我的看法。假设你有类似的东西:

# let's pick a dungeon
d = Dungeon.first

# say you find also find a trap that belongs to this particular d
t = Trap.find(...)

# then t.dungeon is the exact same object as d
d == t.dungeon

当然dungeon.traps.first.dungeon没有真正的意义,我怀疑这就是为什么存在。就我个人而言,我不知道我会在哪里以及如何使用它,但他们给出的例子似乎填补了一个用例。它是这样的:

# you have an attribute level on dungeon
d.level # => 5

# now say you have a comparison after a modification to level
d.level = 10

# now without inverse_of the following thing occurs
d.level         # => 10
t.dungeon.level # => 5

# d was updated and since t.dungeon is a whole different object 
# it doesn't pick up the change and is out of sync but using invers_of you get
d.level         # => 10
t.dungeon.level # => 10

# because d and t.dungeon are the very same object

希望能澄清事情。

于 2013-02-18T01:35:28.037 回答
4

好消息!在 Rails 4.1 中,基本关联* 将自动设置inverse_of.

*更多的便利意味着更多的边缘情况......自动 inverse_of适用于指定以下任何选项的关联:

  • :through
  • :foreign_key
  • :conditions
  • :polymorphic

资源:

http://edgeguides.rubyonrails.org/4_1_release_notes.html http://wangjohn.github.io/activerecord/rails/associations/2013/08/14/automatic-inverse-of.html

于 2014-07-11T18:48:14.160 回答