You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Rails多态关联实现excuse.re_evaluations查询?

多态关联多对多关系的查询问题解决

问题场景

现有基于多态的多对多关联,需要实现:

  • 通过 re_evaluation.excuse 获取关联的Excuse
  • 通过 excuse.re_evaluations 获取该Excuse对应的所有ReEvaluation记录

迁移代码如下:

def change
  create_table :excuses do |t|
    t.string :label
    t.integer :status, default: 0, null: false

    t.timestamps
  end

  create_table :excuses_excusables do |t|
    t.references :excusable, polymorphic: true, index: true, null: false
    t.integer :excuse_id, index: true, null: false
  end
end

现有模型配置无法实现excuse.re_evaluations查询,代码如下:

class ReEvaluation < ApplicationRecord
  has_one :excuses_excusable, as: :excusable
  has_one :excuse, through: :excuses_excusables
end

class Excuse < ApplicationRecord
    has_many :excuses_excusables, foreign_key: :excuse_id
    
    # 无法正常工作
    # has_many :re_evaluations, through: :excuses_excusables, source_type: "ReEvaluation"
end

class ExcusesExcusable < ApplicationRecord
    belongs_to :excusable, polymorphic: true
    belongs_to :excuse
end

解决方案

修改Excuse模型中的关联配置,明确指定关联的源对象和类型:

class Excuse < ApplicationRecord
    has_many :excuses_excusables, foreign_key: :excuse_id
    has_many :re_evaluations, through: :excuses_excusables, source: :excusable, source_type: "ReEvaluation"
end

说明

  • 中间表ExcusesExcusable通过excusable(多态关联)连接ReEvaluation,因此需要通过source: :excusable告诉Rails从中间表关联到excusable对象
  • source_type: "ReEvaluation"指定多态关联的具体模型类型,确保Rails能正确生成查询语句

当前ReEvaluation的关联配置已满足re_evaluation.excuse的查询需求,无需修改。


内容的提问来源于stack exchange,提问作者Jeremy Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:24:56