挿入されていない私は別のモデルB.フェニックスエクト:外部キーが
defmodule MyApp.ModelA do
use MyApp.Web, :model
schema "model_a" do
field :type, :string, null: false
field :data, :string, null: false
belongs_to :model_b, MyApp.ModelB
timestamps()
end
@required_fields ~w(type data)
@optional_fields ~w()
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @required_fields, @optional_fields)
|> assoc_constraint(:model_b)
end
end
とモデルBへの外部キー含まモデルAを挿入しています:
defmodule MyApp.ModelB do
use MyApp.Web, :model
schema "model_b" do
field :username, :string
field :pass, :string
has_many :model_a, MyApp.ModelA
timestamps()
end
@required_fields ~w(username pass)
@optional_fields ~w()
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, @required_fields, @optional_fields)
|> cast_assoc(:model_a)
|> validate_required([])
end
end
モデルBが存在し、 Repo.all(ModelB)を介して取得することができます。
モデルAチェンジセットは正常に検証され、モデルAチェンジセット構造体を印刷するとmodel_b_id値が確認できます。
ただし、挿入すると参照が挿入されません。モデルAのチェンジセットを印刷するときに、MySQLログでこのフィールドが完全に欠落していることがわかりますが、INSERTクエリにはありません。
私はちょっと試してみましたが、この参照フィールドをMySQLテーブルで強制的にヌルにしないと、Repo.insert(...)レスポンスとして挿入するときにこの外部キーフィールドに{"does not exist", []}
が表示されますモデルBはデータベースに存在しますが、
チェンジセットの検証では外部キーの検証はチェックされないため、存在しません "というエラーメッセージが表示されます。モデルのスキーマと、実行したコードとSQLログを投稿できますか? – Dogbert
ソリーリー、多分私は自分自身を説明しなかった。私はRepo.insert(...)の応答として "存在しない"ということを得ます。チェンジセットの検証は、この場合、常に正常に機能します。 – David
チェンジセットに 'model_b_id'がありますか? '@ optional_fields'はちょうどあなたが掲示したコードに従って空です。 '@ optional_fields'に' model_b_id'を追加できますか? – Dogbert