如下所示:
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.
所以我有几个问题.
> has_many为一个belongs_to忽略反向关联吗?如果是这样,他们的例子怎么样呢?不应该不做任何事情吗?
>据我所知(假设它做任何事情)所有这一切允许做的是像:
- dungeon.traps.first.dungeon
最后调用.dungeon不会产生一个全新的查询,而只是到达内存关联.假设是正确的,为什么我不会想要这样的行为?为什么我不会在每个关联上粘贴inverse_of:
解决方法
我开始写关于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
当然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
希望澄清事情.