2017-08-01 8 views
0

私はレールAPIを開発中です。 1つの列に外部キーの配列を保存する際に問題があります。 ブロックと従業員の2つのモデルがあります。従業員は多くのブロックを持ち、has_many従業員をブロックします。多対多の関係。 これはブロックのインデックスです。複数の外部キーを1つの属性に格納する

[{ 
    id:1, 
    name: "Block A" 
}, 
{ 
    id:2, 
    name: "Block B" 
}, 
{ 
    id:3, 
    name: "Block C" 
} 
] 

これは従業員の投稿要求の本文です。

{ 
    "first_name":"John", 
    "last_name": "Smith", 
    "email": "[email protected]", 
    "block_ids":'[1, 2, 3]' 
} 

雇用者ユーザーを作成する場合、従業員が制御するブロックを指定する必要があります。 block_idsカラムでは、上記のブロックの外部キーを保存します。

1)質問:1つのモデル属性に配列を使用して多数の外部キーを格納する方法次に、どのようにユーザーが制御するブロックを知ることがレールにコントローラを使用して:

そこでスミスIDが1、2及び3

2)質問に等しいブロックを制御します。私は、block_ids属性で指定されるIDを使ってブロックの名前を知る方法を意味します。

+1

あなたの質問がありますか?あなたは何をしようとしているのですか? @SteveTurczyn。 – SteveTurczyn

+0

。私は自分の質問を編集しました –

+0

あなたの従業員は多くのブロックを持つことができ、1つのブロックは多くの従業員に属することができますか? Railsでは、このようなデータを格納しないため、データをフェッチするカスタムメソッドを作成する必要があります。 – Deep

答えて

1

これは間違ったアプローチです。外部キーを配列に格納しないでください。代わりに結合テーブルを作成します。

最も簡単な構成では、has-and-belongs-to-many relationshipを使用します。これは、2つのモデルを独自のものとして接続するものを参照する必要がない場合などに使用します。車には多くの部品があります。接続が実際のものである場合など。医師と患者を接続する予定の場合は、has-many-through relationshipを使用します。ここでは、結合テーブルに独自のモデルがあります。

これらのアプローチが優れている理由は、外部キーを配列に格納すると、SQLが適切なJOINを使用してデータ全体を照会することができなくなるためです。また、それらを外部キーとして特にマークすることはできませんので、データベースで必要な場合はreferential integrityを実施することができません。

関連する問題