У меня есть схемы, которая выглядит следующим образом:Строить отношения has_one
defmodule Busiket.LanguageCode do
use Busiket.Web, :model
schema "languages_code" do
field :code, :string
field :text, :string
timestamps
end
end
вторая схема:
defmodule Busiket.CountryCode do
use Busiket.Web, :model
schema "countries_code" do
field :alpha2, :string
field :alpha3, :string
timestamps
end
end
и третья таблица
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
, как вы можете увидеть на третья схема, поле code
должно зависеть от country_code
схемы с полем code
.
Поле lang должно быть зависеть от language_code
Схема с полем alpha2
.
Я не знаю, если страна схемы хорошо спроектирована?
Записи в странах должно выглядеть:
"CH" | "EN" | "Switzerland"
"DE" | "EN" | "Germany"
и эта запись должна faild:
"YY" | "EN" | "Foo"
, потому что нет страна с YY
изо кода.
Файл миграции из language_code
выглядит следующим образом:
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
и 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
и наконец-то я пытался с country
миграции:
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
Я надеюсь, что это ясно, что я хочу достичь.
UPDATE
Я создал таблицу, как ты грустишь:
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
Когда я исполняю ecto.migrate микс, я получил следующее сообщение об ошибке:
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"
Я думаю, , Я должен изменить: alpha3 не быть уникальным.
Как has_one в 'схемах LanguageCode' CountryCode' и' должно выглядеть? –
Я обновил свой пост. –
Я думаю, вам также нужно добавить уникальный индекс для 'alpha2' в' countries_code' и 'code' в' languages_code'. Обязательно повторно запустите миграцию, если вы измените существующую миграцию, чтобы добавить эти поля. – Dogbert