2016-11-13 3 views
1

У меня есть схемы, которая выглядит следующим образом:Строить отношения 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 не быть уникальным.

ответ

1

Две вещи:

  1. Вы хотите belongs_to в CountryCountry поскольку «s таблица содержит внешние ключи. Вам также необходимо указать имя столбца внешней таблицы в belongs_to.

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

    has_one В декларации должны быть в CountryCode и LanguageCode схем.

  2. Опция, которую вы хотите указать при миграции, - column, и это должно быть в вызове references. (Нет name вариант в add, который использует текущий код.) Вам также необходимо указать type.

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

Как has_one в 'схемах LanguageCode' CountryCode' и' должно выглядеть? –

+0

Я обновил свой пост. –

+1

Я думаю, вам также нужно добавить уникальный индекс для 'alpha2' в' countries_code' и 'code' в' languages_code'. Обязательно повторно запустите миграцию, если вы измените существующую миграцию, чтобы добавить эти поля. – Dogbert

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