片側で複数のタイプのオブジェクトを処理できるリンクテーブルがあり、has_manyを使用してこれらのオブジェクトの1つからリンクテーブルに移動する方法を理解できません。
例:リンクテーブルには次のものが含まれます。
id link_id link_table resource_id 1 1 page 3 2 1 page 5 3 2 page 3 4 1 not_page 1
リソース側からの関係の構築は非常に簡単です。
Resource->has_many(links => 'Link', 'resource_id');
しかし、ページ側から対応する関係を取得できませんでした。
Page->has_many(links => 'Link', 'link_id');
not_pageリンクを取得します
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'page'});
'Invalid rel cond val page'エラーが発生します(これは私にとってそれほど驚くことではありませんでした)。
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => '"page"'});
'Invalid rel condval"page"'エラーが発生します。バックスラッシュを投げても役に立ちませんでした。
DBIx :: Class :: Relationship :: Baseのコメント:
条件は、テーブル間の結合のSQL::Abstractスタイルの表現である必要があります
そして、私はそこから次のようなさまざまなオプションを試しました。
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => {'=', 'page'}});
しかし、まったく成功しませんでした。
常に値'page'を含むページテーブルに別のフィールドを追加した場合、私は行うことができます
Page->has_many(links => 'Link', {'foreign.link_id' => 'self.id', 'foreign.link_table' => 'self.what_table_am_i'});
しかし、それはほとんど最適な解決策ではありません。
リンクテーブルをタイプごとに個別に分割することも可能ですが、これはDBIx :: Classへの適応を検討している既存のプロジェクトであり、テーブルを他の複数のテーブルに分割する方が多い場所もあります。それが価値があるよりも面倒。