単一テーブル継承 (STI)を使用して基底クラスから派生するモデルとの多態的関連付けを使用したいと考えています。私はすでにこの問題をさらに調査し、(もちろん)スタックオーバーフローを掘り下げました。残念ながら、私が見つけたすべての情報は、ポリモーフィックな関連付けに関するものでしたが、STI のコンテキストでの使用に関するものではありませんでした。
私の現在のプロジェクトでは、1 つのスクリーンショットとそれにリンクされた多くのアセットを持つデザインがあります。一部のアセット (バリエーション アセット) には、リンクされたスクリーンショットも必要です。デザインには多くのアセットがあるため、それらを介してすべてのスクリーンショットを取得したいと考えています。
design.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
asset.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
予想どおり(そして望んでいた)が発生します。したがって、ポリモーフィック インターフェイスは機能しているように見え、スキーマで正しく設定されています。
schema.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
から theまでのevery をクエリするとAsset
、次のエラーが発生します。
active_record/reflection.rb:509:`check_validity!' で: ソースの関連付けが見つかりませんでした:screenshot または :screenshots がモデル アセットにあります。「has_many :screenshots, :through => :assets, :source =>」を試してください。:design の 1 つですか? (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 repoにあります。
どんな助けでも大歓迎です!:-)