Rails 7中where.missing关联查询SQL报错适配问题求助
问题分析
升级到Rails 7后,执行where.missing(:order_review_requests)查询时,Rails会为关联表order_review_requests生成单数别名order_review_request,但Philia的acts_as_tenant默认作用域硬编码了原表名order_review_requests.tenant_id,导致SQL中出现未识别列的报错。
解决方案
核心是修改Philia的acts_as_tenant实现,避免硬编码表名,改用Rails的Arel抽象层自动适配表别名:
修改Philia的Base模块代码:
module Philia module Base def self.included(base) base.extend ClassMethods end module ClassMethods def acts_as_tenant belongs_to :tenant validates_presence_of :tenant_id # 用Arel引用字段,自动适配表别名 default_scope -> { where(arel_table[:tenant_id].eq(Thread.current[:tenant_id])) } end end end end
原理说明
Arel是Rails内置的SQL抽象层,arel_table[:tenant_id]会根据当前查询中表的实际别名自动生成正确的字段引用,无论Rails是否为表添加了别名,都能保证SQL语法的正确性。
如果无法修改Philia源码,也可以在OrderReviewRequest模型中单独覆盖默认作用域(此方案仅适配单个模型,通用性较差):
class OrderReviewRequest < ApplicationRecord acts_as_tenant default_scope -> { where(arel_table[:tenant_id].eq(Thread.current[:tenant_id])) } end
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

