ruby-on-rails 如何使用连接表编写Rails多态关联查询

0yycz8jy  于 2023-03-09  发布在  Ruby
关注(0)|答案(1)|浏览(167)

我通过多态关联建立了多对多关系,但在编写查询时遇到了问题
下面是我的迁移:

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_evalutations,这样我就可以从re_evaluation调用re_evaluation.excuse。借口是一组预定义的借口,用户可以从中选择,这就是为什么我走了多对多的路线。
我不明白的部分是如何调用excuse.re_evaluations,以便能够使用给定的excuse获取所有re_evaluations

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

class Excuse < ApplicationRecord
    has_many :excuses_excusables, foreign_key: :excuse_id
    
    # Does not work
    # has_many :re_evaluations, through: :excuses_excusables, source_type: "ReEvaluation"
end

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

如何修改这些关联以允许调用excuse.re_evaluations

wf82jlnq

wf82jlnq1#

已正确使用source_type属性为多态关联指定正确的类型筛选器。但是,无法从关联名称(re_evaluations)推断源关联(excusable),您需要显式指定它(source: :excusable)。
因此,如果你这样修改你的代码,它应该工作:

has_many :re_evaluations, through: :excuses_excusables, source: :excusable, source_type: "ReEvaluation"

相关问题