建立has_one关系

时间:2016-11-13 16:21:32

标签: elixir ecto

我有模式,如下所示:

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的{​​{1}}架构。

lang字段应取决于code架构与字段language_code

我不知道,如果架构国家设计得很好?

各国的条目应如下:

alpha2

并且此记录应该是faild:

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

因为没有"YY" | "EN" | "Foo" iso代码的国家/地区。

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

当我执行mix ecto.migrate时,我遇到以下错误:

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

我认为,我必须改变:alpha3不是唯一的。

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 您希望belongs_to中的Country Country,因为belongs_to的表包含外键。您还需要在schema "countries" do belongs_to :code, CountryCode, foreign_key: :alpha2 belongs_to :lang, LanguageCode, foreign_key: :code ... end 中指定外部表的列名。

    has_one

    CountryCode声明应位于LanguageCodecolumn架构中。

  2. 您要在迁移中指定的选项为references,该选项应位于name的调用中。 ({1}}中没有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