如何修改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
相关产品推荐
相关产品推荐

