我想将多态关联与使用单表继承 (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
分配Screenshot
给VariationAsset
效果很好。尝试这样做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 存储库中找到上述代码的“工作”示例。
任何帮助表示赞赏!:-)