2016-11-13 1 views
1

I-Schemata haben, sieht das wie folgt:Körperbau has_one Beziehung

defmodule Busiket.LanguageCode do 

    use Busiket.Web, :model 


    schema "languages_code" do 

     field :code, :string 
     field :text, :string 

     timestamps 
    end 
end 

das zweite Schema:

defmodule Busiket.CountryCode do 

    use Busiket.Web, :model 

    schema "countries_code" do 

    field :alpha2, :string 
    field :alpha3, :string 

    timestamps 
    end 

end 

und die dritte Tabelle

defmodule Busiket.Country do 

    use Busiket.Web, :model 

    alias Busiket.LanguageCode 
    alias Busiket.CountryCode 

    schema "countries" do 

    has_one :code, CountryCode 
    has_one :lang, LanguageCode 
    field :text, :string 

    timestamps 

    end 

end 

, wie Sie auf die sehen können drittes Schema, das Feld code sollte von country_code Schema mit Feldabhängen 210.

Das Feld lang sollte von language_code Schema mit Feld alpha2 abhängen.

Ich weiß nicht, ob das Schema Land gut gestaltet ist? faild

"CH" | "EN" | "Switzerland" 
"DE" | "EN" | "Germany" 

und dieser Datensatz sollte:

Die Einträge in den Ländern sollte wie folgt aussieht iso

Code YY ein Land mit
"YY" | "EN" | "Foo" 

, weil es keine.

Die Migrationsdatei von language_code sieht wie folgt:

defmodule Busiket.Repo.Migrations.CreateLanguageCode do 
    use Ecto.Migration 

    def change do 

    create table(:languages_code) do 

     add :code, :string, size: 3 
     add :text, :string 

     timestamps 

    end 

    end 
end 

und country_code

defmodule Busiket.Repo.Migrations.CreateCountryCode do 
    use Ecto.Migration 

    def change do 

     create table(:countries_code) do 

     add :alpha2, :string, size: 2 
     add :alpha3, :string, size: 3 

     timestamps 
    end 

    end 
end 

und zuletzt habe ich versucht, mit country Migration:

defmodule Busiket.Repo.Migrations.CreateCountryTable do 
    use Ecto.Migration 

    def change do 

    create table(:countries) do 

    add :code, references(:countries_code), [name: :alpha2] 
    add :lang, references(:languages_code), [name: :code] 
    add :text, :string 

    timestamps 

    create unique_index(:countries, [:code, :lang]) 

    end 
    end 
end 

Ich hoffe, es ist klar, was ich erreichen will.

UPDATE

habe ich den Tisch, wie Sie traurig:

defmodule Busiket.Repo.Migrations.CreateCountryTable do 
    use Ecto.Migration 

    def change do 

     create table(:countries) do 

      add :coun, references(:countries_code, column: :alpha2, type: :string) 
     add :lang, references(:languages_code, column: :code, type: :string) 
      add :text, :string 

      timestamps 
     end 

     create unique_index(:countries, [:coun, :lang]) 

    end 
end 

Wenn ich Mix ecto.migrate ausführen, habe ich folgende Fehlermeldung anzeigt:

20:34:11.012 [info] create table countries 
** (Postgrex.Error) ERROR (invalid_foreign_key): there is no unique constraint matching given keys for referenced table "countries_code" 

Ich denke, Ich muss mich ändern: Alpha3 ist nicht einzigartig.

Antwort

1

Zwei Dinge:

  1. Sie wollen belongs_to in Country seit Country ‚s Tabelle mit dem Fremdschlüssel enthält. Sie müssen außerdem den Spaltennamen der Fremdtabelle in belongs_to angeben.

    schema "countries" do 
        belongs_to :code, CountryCode, foreign_key: :alpha2 
        belongs_to :lang, LanguageCode, foreign_key: :code 
        ... 
    end 
    

    Die has_one Erklärungen sollten in CountryCode und LanguageCode Schemata sein.

  2. Die Option, die Sie in der Migration angeben möchten, lautet column, und diese sollte im Aufruf von references enthalten sein. (Es gibt keine name Option in add, die Ihr aktueller Code verwendet.) Sie müssen auch type angeben.

    create table(:countries) do 
        add :code, references(:countries_code, column: :alpha2, type: :string) 
        add :lang, references(:languages_code, column: :code, type: :string) 
        ... 
    end 
    
+0

Wie has_one in 'CountryCode' und' LanguageCode' Schemata sollten aussieht? –

+0

Ich habe meinen Beitrag aktualisiert. –

+1

Ich denke, Sie müssen auch einen eindeutigen Index für 'alpha2' in' countries_code' und 'code' in' languages_code' hinzufügen. Stellen Sie sicher, dass Sie die Migrationen erneut ausführen, wenn Sie die vorhandene Migration bearbeiten, um diese Felder hinzuzufügen. – Dogbert

Verwandte Themen