首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >inverse_of是做什么的?它会生成什么SQL?

inverse_of是做什么的?它会生成什么SQL?
EN

Stack Overflow用户
提问于 2012-02-15 23:58:21
回答 5查看 49.4K关注 0票数 162

我试图让我的头脑围绕inverse_of,但我不明白。

生成的sql是什么样子,如果有的话?

当与:has_many:belongs_to:has_many_and_belongs_to一起使用时,inverse_of选项是否表现出相同的行为

如果这是一个如此基本的问题,很抱歉。

我看到了这个例子:

代码语言:javascript
复制
class Player < ActiveRecord::Base
  has_many :cards, :inverse_of => :player
end

class Card < ActiveRecord::Base
  belongs_to :player, :inverse_of => :cards
end
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-16 01:01:37

the documentation看来,:inverse_of选项似乎是一种避免SQL查询的方法,而不是生成查询的方法。这是对ActiveRecord的一个提示:使用已经加载的数据,而不是通过关系再次获取它。

他们的例子:

代码语言:javascript
复制
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

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end

在这种情况下,调用dungeon.traps.first.dungeon应该返回原始的dungeon对象,而不是默认情况下加载新的对象。

票数 136
EN

Stack Overflow用户

发布于 2014-03-07 07:53:26

我认为当您处理尚未持久化的关联时,:inverse_of是最有用的。例如:

代码语言:javascript
复制
class Project < ActiveRecord::Base
  has_many :tasks, :inverse_of=>:project
end

class Task < ActiveRecord::Base
  belongs_to :project, :inverse_of=>:tasks
end

现在,在控制台中:

代码语言:javascript
复制
irb> p = Project.new
=> #<Project id: nil, name: nil, ...>
irb> t = p.tasks.build
=> #<Task id: nil, project_id: nil, ...>
irb> t.project
=> #<Project id: nil, name: nil, ...>

如果没有:inverse_of参数,t.project将返回nil,因为它会触发一个sql查询,而数据还没有存储。使用:inverse_of参数,可以从内存中检索数据。

票数 51
EN

Stack Overflow用户

发布于 2015-05-10 02:46:22

当我们有两个具有has_many和belongs_to关系的模型时,最好使用inverse_of,它会通知ActiveRecod它们属于关联的同一方。因此,如果从一侧触发查询,如果从相反方向触发,则它将缓存并从缓存中提供服务。这提高了性能。从Rails4.1开始,如果我们使用foreign_key或我们需要显式设置的类名更改,inverse_of将被自动设置。

关于细节和例子的最佳文章。

http://viget.com/extend/exploring-the-inverse-of-option-on-rails-model-associations

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9296694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档