我有模式,如下所示:
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不是唯一的。
答案 0 :(得分: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
声明应位于LanguageCode
和column
架构中。
您要在迁移中指定的选项为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