2016-04-05 22 views

cevap

43

A Little sonuçta size bir hata vermek yerine bir istisna durumu sadece modeline unique_index oluşturmak kullanma Patrick cevap

takip.

Hata almak için, değişiklik kümenizde bir kısıtlama ekleyin, ancak bir paremeter olarak, unique_index tarafından oluşturulan dizin adını verebilirsiniz. Taşıma dosyasında Yani

: En Değişiklik listesi Sonra

create unique_index(:your_table, [:col1, :col2], name: :your_index_name) 

: Sorunun örnekte görüldüğü gibi

def changeset(model, param \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    |> unique_constraint(:name_your_constraint, name: :your_index_name) 
end 
+0

Bu, kabul edilen yanıt imo olarak işaretlenmelidir. @ TheSquad, does: name_your_constraint: col1 veya: col2 bu bağlamda olması gerekir? Referans: https://hexdocs.pm/ecto/Ecto.Changeset.html#unique_constraint/3 – Olshansk

+1

kesinlikle değil, kısıtlama karşılanmadığında kapsamlı bir hata mesajı almak istediğiniz herhangi bir atomu koyabilirsiniz – TheSquad

10

Sen kompozit anahtarlara sahip isterseniz herhalde

create unique_index(:some_table, [:col1, :col2]) 

ile birden fazla satıra benzersiz bir dizin oluşturabilir, el SQL çalıştırmak için execute/1 kullanmak gerekir. Kompozit tuşların Ecto ile ne kadar iyi çalıştığından emin değilim, genellikle sadece tablo başına standart seri kimliğiyle uğraşırım.

Bileşik anahtar yaklaşımıyla devam ederseniz, NOT NULL kısıtlamalarının gerekli olmadığını düşünüyorum. Bileşik anahtar, sütunların boş olmadığından zaten zorlamalıdır.

4

unique_indexbileşik birincil anahtar oluşturun ederim. Benzersiz bir kısıtlama yaratıyor. Eğer bir bileşik birincil anahtar oluşturmak istiyor yoksa

(not: önerilmez Ecto ile çalışıldığında), there's more information here:

Göç:

defmodule HelloPhoenix.Repo.Migrations.CreatePlayer do 
    use Ecto.Migration 

    def change do 
    create table(:players, primary_key: false) do 
     add :first_name, :string, primary_key: true 
     add :last_name, :string, primary_key: true 
     add :position, :string 
     add :number, :integer 
     ... 

Şema:

defmodule HelloPhoenix.Player do 
    use Ecto.Schema 

    @primary_key false 
    schema "players" do 
    field :first_name, :string, primary_key: true 
    field :last_name, :string, primary_key: true 
    field :position, :string 
    field :number, :integer 
    ... 

Çoğu durumda, unique_index istediğiniz gibi.

İlgili konular