我在不同的地方读到过,在某些情况下会自动推断,但是我发现关于这个特性的文档很难理解。有人能说明一下这些原则吗?,具体来说,什么时候Rails可以推断,什么时候Rails不能推断逆?。
我想考虑一下
BundleProduct和IndividualProduct都继承Product并使用products表)一些上下文:--我正在维护一个相当大的、具有9年历史的Rails应用程序,其中有许多表。我希望对哪些模型需要添加inverse_of:提供一些指导,而不是必须更改系统中的每个模型。
发布于 2019-01-09 14:35:04
如果不设置:inverse_of记录,则关联将尽最大努力将自己与正确的逆匹配起来。自动逆检测仅适用于has_many、has_one和belongs_to关联。 -- Rails API文档-ActiveRecord::Association::ClassMethods
但是,在有“非标准”命名的情况下,您可能需要提供以下选项:
逆关联的自动猜测使用基于类名的启发式,因此它可能不适用于所有关联,特别是具有非标准名称的关联。-- Rails API文档-ActiveRecord::Association::ClassMethods
例如:
class Pet < ApplicationRecord
belongs_to :owner, class_name: 'User'
end
class User < ApplicationRecord
has_many :pets
end如果我们调用pet.owner,即使我们已经加载了该记录,它也可能导致数据库被击中。
如果我们添加inverse_of选项:
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查询。或在测试套件中使用斗牛士来手动测试是否需要它。
https://stackoverflow.com/questions/54106622
复制相似问题