gpt4 book ai didi

ruby-on-rails - 使用多态关联时如何避免 n+1 查询?

转载 作者:行者123 更新时间:2023-12-04 01:15:05 28 4
gpt4 key购买 nike

我有 4 个模型,让我们说:

class Photo < ActiveRecord::Base
belongs_to :photoable, polymorphic: true
end

class User < ActiveRecord::Base
has_one :photo, as: :photoable
end

class Company < ActiveRecord::Base
has_one :photo, as: :photoable
has_many :products
end

class Products < ActiveRecord::Base
belongs_to :company
end

因此,查询 Photo.all.includes(:photoable)作品。

但是如果我使用 Photo.all.includes(photoable: :products)仅当所有加载的照片都属于公司时才有效。如果关系包含用户和公司的照片,则会引发此错误:
ActiveRecord::ConfigurationError (Association named 'products' was not found; perhaps you misspelled it?):

发生这种情况是因为用户与产品没有关系。

有什么办法可以急切加载 有产品的用户和公司照片的关系?

编辑:

此问题与 Eager load polymorphic 不重复 .正如我在下面评论的那样,在这个问题中,我想为具有不同关联的多态关联(一个有产品而另一个没有)做急切加载。在那个问题中,OP 使用了错误的表名名称。

最佳答案

您可以将特定关联添加到 Photo模型:

class Photo < ActiveRecord::Base
belongs_to :photoable, polymorphic: true

belongs_to :user, -> { where(photoable_type: 'User' ) }, foreign_key: :photoable_id
belongs_to :company, -> { where(photoable_type: 'Company' ) }, foreign_key: :photoable_id
end

之后,您可以预加载嵌套的特定关联:
photos = Photo.all.includes(:photoable, company: :products)

可以访问这样的记录:
photos.each do |photo|
puts photo.photoable.inspect
puts photo.company.products.inspect if photo.photoable_type == "Company"
end

这种方法加载 company关联两次,但不进行 n+1 查询。

关于ruby-on-rails - 使用多态关联时如何避免 n+1 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28170888/

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