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
CodeYY
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.
Wie has_one in 'CountryCode' und' LanguageCode' Schemata sollten aussieht? –
Ich habe meinen Beitrag aktualisiert. –
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