首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Rails 5开始,何时需要手动设置:inverse_of?

从Rails 5开始,何时需要手动设置:inverse_of?
EN

Stack Overflow用户
提问于 2019-01-09 09:15:34
回答 2查看 5K关注 0票数 9

我在不同的地方读到过,在某些情况下会自动推断,但是我发现关于这个特性的文档很难理解。有人能说明一下这些原则吗?,具体来说,什么时候Rails可以推断,什么时候Rails不能推断逆?

我想考虑一下

  • 多态联想
  • 单表继承(例如,BundleProductIndividualProduct都继承Product并使用products表)
  • 规则有一个/有多个/属于协会。
  • 有许多途径:协会

一些上下文:--我正在维护一个相当大的、具有9年历史的Rails应用程序,其中有许多表。我希望对哪些模型需要添加inverse_of:提供一些指导,而不是必须更改系统中的每个模型。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-09 14:35:04

如果不设置:inverse_of记录,则关联将尽最大努力将自己与正确的逆匹配起来。自动逆检测仅适用于has_many、has_one和belongs_to关联。 -- Rails API文档-ActiveRecord::Association::ClassMethods

但是,在有“非标准”命名的情况下,您可能需要提供以下选项:

逆关联的自动猜测使用基于类名的启发式,因此它可能不适用于所有关联,特别是具有非标准名称的关联。-- Rails API文档-ActiveRecord::Association::ClassMethods

例如:

代码语言:javascript
复制
class Pet < ApplicationRecord
  belongs_to :owner, class_name: 'User'
end

class User < ApplicationRecord
  has_many :pets
end

如果我们调用pet.owner,即使我们已经加载了该记录,它也可能导致数据库被击中。

如果我们添加inverse_of选项:

代码语言:javascript
复制
class Pet < ApplicationRecord
  belongs_to :owner, class_name: 'User', inverse_of: :pets
end

class User < ApplicationRecord
  has_many :pets, inverse_of: :owner
end

现在,如果我们已经有了内存中的owner记录,那么pet.owner将指向相同的owner

通常,显式设置inverse_of并没有坏处,所以您可以为不确定的每一种情况设置它。您还可以通过查看访问共享位置通过控制台创建一个DB查询。或在测试套件中使用斗牛士来手动测试是否需要它。

票数 15
EN

Stack Overflow用户

发布于 2019-01-09 10:11:52

您可以在中查找精确的推断过程。

Rails试图检测has_manyhas_onebelongs_to中没有throughforeign_key选项和作用域并具有标准名称的逆(这在官方指南中也有描述)。

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

https://stackoverflow.com/questions/54106622

复制
相关文章

相似问题

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