2015-12-13 2 views
5

Я пытаюсь сделать 2 уникальных ограничения по полю в Ecto Postgres. До сих пор мне удалось сделать:unique_constraint на 2 поля, которые не распознаются

В миграции:

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

набор изменений:

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 

также пытались:

|> unique_constraint(: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 has not defined any constraint. 

Который, как я думал, я уже сделал. Какие-либо предложения?

Edit:

Действие:

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 

Egzample присутствие в коде выше, когда нет никакой ошибки:

%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: Теперь я получаю:

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 
+2

Ваше определение, похоже, соответствует примеру в документации эктопаразитов. Попробуйте передать имя индекса непосредственно в ограничение, как это было сделано в этом [блоге] (http://blog.praveenperera.com/using-compound-unique-indexes-to-validate-uniqueness-of-ecto-associations) , т.е. 'unique_constraint (: special_event_user)' – AbM

+0

То же самое для меня ... – Haito

+1

Можете ли вы предоставить код, который вы используете для создания записи? – Gazler

ответ

7

Вы не собираетесь ough your yoursetet function.

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

Должно быть:

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

Ну .. бессмысленное копирование иногда бывает болезненным. Большое вам спасибо за ваше время, сэр. – Haito

+0

Можете еще раз взглянуть на нижнюю часть главного сообщения? Я получаю еще одну странную ошибку. Он все еще говорит мне, что я не назвал эту функцию. Но на этот раз он запрашивает имя вызываемых функций, где он очень похож на тот, который я использовал. – Haito

+0

Если у вас есть ошибка ограничения и используйте 'Repo.insert!' Вместо 'Repo.insert', то он будет повышаться. Может ли это быть тем, что происходит? – Gazler

 Смежные вопросы

  • Нет связанных вопросов^_^