0

我想将多态关联与使用单表继承 (STI)从基类派生的模型一起使用。我已经对这个问题进行了进一步调查,并且(当然)通过 stackoverflow 进行了挖掘,例如这里(ActiveRecord、has_many :through 和 Polymorphic Associations)和那里(ActiveRecord、has_many :through、Polymorphic Associations with STI)。不幸的是,我发现的所有信息都与多态关联有关,但与 STI 上下文中的用法无关。

在我当前的项目中,我有一个设计,它有一个屏幕截图和许多链接到它的资产。一些资产(变体资产)也应该有与之链接的屏幕截图。因为一个设计有很多资产,我想通过它们获取所有屏幕截图。

设计.rb

class Design < ActiveRecord::Base
  has_one :screenshot, as: :screenshotable, dependent: :destroy
  has_many :assets, dependent: :destroy
  has_many :screenshots, through: :assets
end

截图.rb

class Screenshot < ActiveRecord::Base
  belongs_to :screenshotable, polymorphic: true
end

资产.rb

class Asset < ActiveRecord::Base
  belongs_to :design
end

变体资产.rb

class VariationAsset < Asset
    # this is the important part as only a
    # variation asset should have a screenshot
    has_one :screenshot, as: :screenshotable, dependent: :destroy
end

分配ScreenshotVariationAsset效果很好。尝试这样做Asset会引发NoMethodError预期的(和想要的)。因此,多态接口似乎工作并在模式中正确设置。

架构.rb

create_table "screenshots", :force => true do |t|
  t.string  "name"
  t.integer "screenshotable_id"
  t.string  "screenshotable_type"
end

create_table "assets", :force => true do |t|
  t.string  "name"
  t.integer "design_id"
  t.string  "type"
end

Screenshot从 aDesign到查询每一个Asset都会引发以下错误:

active_record/reflection.rb:509:in `check_validity!':在模型资产中找不到源关联:屏幕截图或:屏幕截图。尝试 'has_many :screenshots, :through => :assets, :source => '。它是:设计之一吗?(ActiveRecord::HasManyThroughSourceAssociationNotFoundError)

我按照错误消息中的建议使用参数进行了尝试,:source但这也没有帮助。

当我将has_one :screenshot, as: :screenshotable, dependent: :destroy线路放入 STI 基类时,它可以工作Asset

class Asset < ActiveRecord::Base
  belongs_to :design
  has_one :screenshot, as: :screenshotable, dependent: :destroy
end

我认为这与through:参数有关,并且(对我而言)似乎不可能告诉它调查VariationAsset而不是以Asset某种方式进行调查。

您可以在我的github 存储库中找到上述代码的“工作”示例。

任何帮助表示赞赏!:-)

4

0 回答 0