gpt4 book ai didi

ruby-on-rails - 从Rails 5开始,何时:inverse_of necessary to set manually?

转载 作者:行者123 更新时间:2023-12-03 15:44:56 26 4
gpt4 key购买 nike

我在不同的地方都读过它在某些情况下会自动推断出来,但是我发现关于此功能的文档很难理解。谁能阐明一些原则? 特别是Rails何时可以推断,Rails何时不能推断逆?

我想考虑

  • 多态关联
  • 单表继承(例如BundleProductIndividualProduct都从Product继承并使用products表)
  • 常规has_one/has_many/belongs_to关联
  • 有很多通过:关联

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

    最佳答案

    If you do not set the :inverse_of record, the association will do its best to match itself up with the correct inverse. Automatic inverse detection only works on has_many, has_one, and belongs_to associations.
    -- Rails API docs - ActiveRecord::Associations::ClassMethods



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

    The automatic guessing of the inverse association uses a heuristic based on the name of the class, so it may not work for all associations, especially the ones with non-standard names. -- Rails API docs - ActiveRecord::Associations::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没有什么害处,因此可以在不确定的每种情况下进行设置。您还可以通过查看 accessing the assocation creates a DB query via the console或在测试套件中使用 shoulda-matchers来手动测试是否需要。

    关于ruby-on-rails - 从Rails 5开始,何时:inverse_of necessary to set manually?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54106622/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com