0

単一テーブル継承 (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

に割り当てるScreenshotVariationAssetうまくいきます。これを試してみるとAssetNoMethodError予想どおり(そして望んでいた)が発生します。したがって、ポリモーフィック インターフェイスは機能しているように見え、スキーマで正しく設定されています。

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

ScreenshotaDesignから 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:調べるように指示することは不可能に思われるという事実に関係していると思います。VariationAssetAsset

上記のコードの「動作する」例は、私のgithub repoにあります。

どんな助けでも大歓迎です!:-)

4

0 に答える 0