2016-06-26 12 views
0

埋め込みスキーマの一意制約を取得する方法はありますか?埋め込みスキーマの一意制約

下記のコードでは、例外を与える:それはソース

フィールドnameaccounts

からスキーマ personsとフィールド emailから来ていないので、

はチェンジセットする制約を追加することはできません

スキーマ:

embedded_schema do 
    field :name 
    field :email 
end 

チェンジは:

struct 
    |> Ecto.Changeset.cast(params, [:name, :email]) 
    |> Ecto.Changeset.validate_required([:name, :email]) 
    |> Ecto.Changeset.unique_constraint(:email) 

私は、パラメータとしてではなく、成功しませんスキーマaccountsを与えることを試みました。

+0

モジュールのコードを投稿できますか? 'Use App.Web、:model'を設定する必要がありましたか? – Mohamad

答えて

1

埋め込まれたスキーマのために働いてユニーク制約を取得する方法はありますか?

短い答えはノーです。

エクトのunique_constraintは、データベースに依存しています。機能させるには、指定したフィールドに一意のインデックスを追加する必要があります。この制約は、データベースエラーをチェンジセットエラーに変換するだけです。 embedded_schemaを使用すると、それはフィールド自体ではありませんので、あなたが、email「フィールド」に一意のインデックスを持つことができないことを意味し

:あなたは、ドキュメントに https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3

編集をより多くを読むことができます。 Ectoは1つのjsonbフィールドを使用して埋め込みデータを格納します。

データベースに関連しているAccountスキーマを作成することができます。次に、手動でデータをアカウントチェンジセットにマップし、unique_constraintを使用することができます。

+0

JSONとして保存されません。 'name'フィールドは' persons'テーブルに格納され、 'email'フィールドは' accounts'テーブルに格納されます。だから私はこれに制約を使うことができると思った。ちょっとした背景情報:私は 'insert_all'を試しています(http://blog.plataformatec.com.br/2016/05/ectos-insert_all-and-schemaless-queries/)そのために私は新しい '人物'email'のようないくつかのアカウント情報で。 – Hatsjoem

+1

私は参照してください。スキーマがデータベースに関係していないので、この変更セットで 'unique_constraint'を使用することはできません。あなたは 'Account'スキーマを定義し、アカウント変更セットに' unique_constraint'を持たせることができます。したがって、データを手動で 'account'チェンジセットにマップする必要があります。チェンジセットはユニーク制約を使用します。 – ventsislaf

+0

私は何をするつもりです。しかし、私はそれを 'account'モデルにマッピングせずに行う方法があると思っていました/ – Hatsjoem

関連する問題