微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 为什么我不想在任何地方使用inverse_of?

如下所示:

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

希望澄清事情.

原文地址:https://www.jb51.cc/ruby/272398.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐