そのため、電話番号のリストを 1 つの列に格納する方法について少し混乱しています。要件は次のとおりです。
- ユーザーは複数の電話番号を持つことができます。
- 電話番号は一意である必要があるため、ユーザー A がユーザー B が使用する電話番号を追加した場合、検証エラーが表示されます。
- ユーザーが複数の電話番号を持っている場合は、デフォルトの電話番号を選択する必要があります。
- ソリューションは Postgresql と互換性がある必要があります。
私は4つの可能な解決策を考えました:
- HStore:
phone_number
すべての電話番号のハッシュを格納するフィールドを作成します。例えば{1=>"+1-800-123-1234", 2=>"9237492734", "default"=>1}
。この場合、新しい電話番号が一意であることを確認するために、多くのクエリを実行する必要があります。たとえば、クエリを実行してからUser.where("phone_number @> ('1' => '+1-800-123-1234')")
2 をチェックインする必要がありますUser.where("phone_number @> ('2' => '+1-800-123-1234')")
...など。 - 1 つのフィールドに電話番号の配列:
phone_number
「+1-800-123-1234,9237492734」のようなカンマ区切りの電話番号を格納します。既存の電話番号を確認するのは簡単User.where("phone_number LIKE '%+1-800-123-1234%'")
ですが、データベースがそれを取得するには時間がかかります。default_phone
もテーブルに追加されるか、慣例により最初の電話番号がデフォルトの電話番号になります。 - 電話番号を 3 つに制限し (これで十分です)、
phone_number_1
、phone_number_2
およびphone_number_3
フィールドを作成します。電話番号の一意性をチェックすると、3 つのクエリが消費されます。も追加する必要がありますdefault_phone
。 - 新しいテーブル
phone_numbers
(id:integer、user_id:integer、phone_number:string、default:boolean) を追加し、User モデルと has_many 関係を設定します。これは本当に魅力的ではありません... 1つのフィールドに対してテーブル全体を作成します。ただし、検索が高速で、各ユーザーに無制限の電話番号があります.
アイデア、ヒント、提案は大歓迎です。