为什么我不想在任何地方使用inverse_of?

Abr*_*m P 14 ruby ruby-on-rails associations rails-activerecord

如下所述:

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
Run Code Online (Sandbox Code Playgroud)

他们立即遵循:

 for `belongs_to` associations `has_many` inverse associations are ignored.
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题.

  1. 是负相关忽视了has_many一个belongs_to?如果是这样,他们的榜样有意义吗?它不应该不做任何事情吗?
  2. 据我所知(假设它做了什么)所有这允许做的事情是这样的:

    dungeon.traps.first.dungeon
    
    Run Code Online (Sandbox Code Playgroud)

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

Hug*_*ugo 7

我开始编写有关rails inflector的内容,以及当关联不是模型的直接变形时,如何使用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
Run Code Online (Sandbox Code Playgroud)

当然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
Run Code Online (Sandbox Code Playgroud)

希望澄清事情.