gpt4 book ai didi

ruby-on-rails - Arel 和多态关联连接

转载 作者:行者123 更新时间:2023-12-04 06:08:59 25 4
gpt4 key购买 nike

我有以下内容:

class BaseReseller < ActiveRecord::Base

set_table_name "resellers"

acts_as_nested_set

has_many :merchants, :as => :merchant_owner, :dependent => :destroy
end

class IPSP < BaseReseller
end

class Agent < BaseReseller
end

class Reseller < BaseReseller
end

class Merchant < ActiveRecord::Base
belongs_to :merchant_owner, :polymorphic => true
end

class MerchantsController < ApplicationController
...
def index
...
@merchants = Merchant.joins(:merchant_owner) # breaks!
end
end

请注意我是如何尝试使用多态 merchant_owner 加入 Merchant 并得到这个:ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :merchant_owner

@merchants = Merchant.includes(:merchant_owner) 最初有效,但是当我开始遍历 View 中的 @merchants 数组时,它因相同的错误而中断 - 似乎是这样,因为我们使用延迟加载的关系并且只当调用非 Arel 方法时,它实际上转到了数据库。

有什么想法吗? Arel 是否支持多态关联连接?任何解决方法?我可以下降到纯 SQL,但这太麻烦了。

谢谢

最佳答案

这对 Arel 的要求可能太高了,我不确定有什么好的解决方案。在您的情况下,看起来所有的 merchant_owners 都共享同一个 reseller 表,因此想要从多态关联中加入是有道理的,但通常多态关联可以与整个数据模型中的各种模型(针对不同的表)相关.这在 SQL 中会变得非常丑陋,并且在一般情况下可能会非常慢,这就是为什么我期望 EagerLoadPolymorphicError 存在。对于您的情况,解决以下问题可能是有意义的:

Merchant.joins("INNER JOIN resellers on merchant_owner_id = resellers.id")

当然,最干净的做法是将此连接作为模型的范围,这样您就可以执行 Merchant.joined_with_owners 并将 SQL 降级到模型层。但是,如果其他非经销商模型有很多商家,这将不起作用。

令我感到惊讶的是,您在 Merchant.includes(:merchant_owner) 中看到了同样的错误,即使在我访问各种属性时我也没有看到类似的数据,但这可能是由于各种差异造成的。

是否出于性能原因或因为您有额外的依赖于经销商属性的 Arel where 子句而尝试预先加载?如果是为了性能,您最好还是使用 SQL...

关于ruby-on-rails - Arel 和多态关联连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9706964/

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