(悪い英語でごめんなさい)
モデルA、B、Cがあるとします。各モデルには1つのアドレスがあります。
「SQLアンチパターン:データベースプログラミングの落とし穴の回避」(第7章-ポリモーフィックアソシエーション)には、「共通スーパーテーブル」(ベーステーブルまたは祖先テーブルとも呼ばれます)を使用してこのようなアソシエーションを回避するレシピがあります。
多形的には、次のようになります。
table addresses:
id: integer
parent_type:string # 'A', 'B' or 'C'
parent_id: integer
交差テーブルを使用できることは知っていますが、次のソリューションはより洗練されているように見えます。
A、B、CをAddressに多態的に関連付ける代わりに、レシピでは、idフィールド(代理キーまたは疑似キー)のみを持つスーパーテーブル(Addressing)を作成することを提案しています。次に、他のテーブルはアドレス指定を参照します。そうすれば、「外部キーによるデータベースのデータ整合性の強制に頼ることができます」と著者は言います。したがって、次のようになります。
table addressing
id: integer
table addresses
id: integer
addressing_id: integer (foreign_key)
zip: string
table a
id: integer
addressing_id: integer (foreign_key)
name: string
table b
id: integer
addressing_id: integer (foreign_key)
name: string
table c
id: integer
addressing_id: integer (foreign_key)
name: string
SQLクエリは次のようになります。
SELECT * from a
JOIN address USING addressing_id
WHERE a.addressing_id = 1243
質問は次のとおりです。Railsでそのようなシナリオをコーディングする方法は?私はいくつかの方法で試みましたが成功しませんでした。