Unique_constraint for 2 fields that are not recognized

I am trying to make 2 unique field restrictions in Ecto Postgres. So far I have succeeded:

In Migration:

create unique_index(:presences, [:event_id, :user_id], name: :special_event_user) 

set of changes:

  def changeset(presence, params \\ :empty) do presence |> cast(params, @required_fields, @optional_fields) |> foreign_key_constraint(:user_id) |> foreign_key_constraint(:event_id) |> unique_constraint(:event_id, name: :special_event_user) end 

Also tried:

 |> unique_constraint(:special_event_user) 

But I keep getting:

 If you would like to convert this constraint into an error, please call unique_constraint/3 in your changeset and define the proper constraint name. The changeset has not defined any constraint. 

What I thought I already did. Any suggestions?

Edit:

Act:

 def assign(conn, %{"event" => event_id}) do case Integer.parse(event_id) do {val, _ } -> case Repo.one(User.unique_user(User, get_session(conn, :login))) do nil -> conn |> put_flash(:error, "BΕ‚Δ…d bazy danych") |> redirect(to: "/event") result -> presence = %Presence{ user_id: result.id, event_id: val, state: Presence.get_assigned } |> Repo.insert! conn |> put_flash(:info, "ZostaΕ‚eΕ› zapisany na wydarzenie") |> redirect(to: "/event") end end end 

If there is an error: Egsample is present above the code:

 %Kpsz.Model.Presence{__meta__: #Ecto.Schema.Metadata<:loaded>, event: #Ecto.Association.NotLoaded<association :event is not loaded>, event_id: 1, id: 1, inserted_at: #Ecto.DateTime<2015-12-14T15:45:39Z>, state: 1, updated_at: #Ecto.DateTime<2015-12-14T15:45:39Z>, user: #Ecto.Association.NotLoaded<association :user is not loaded>, user_id: 1} 

Edit: now I get:

 constraint error when attempting to insert model: * unique: special_event_user If you would like to convert this constraint into an error, please call unique_constraint/3 in your changeset and define the proper constraint name. The changeset defined the following constraints: * unique: presences_special_event_user_index * foreign_key: presences_event_id_fkey * foreign_key: presences_user_id_fkey 
+7
source share
1 answer

You do not go through the change function.

 presence = %Presence{ user_id: result.id, event_id: val, state: Presence.get_assigned } |> Repo.insert! 

Must be:

 presence = Presence.changeset(%Presence{}, %{user_id: result.id, event_id: val, state: Presence.get_assigned}) |> Repo.insert! 
+8
source

Source: https://habr.com/ru/post/1238042/


All Articles