Elixir的Ecto:外键

时间:2016-06-24 04:55:53

标签: elixir ecto

我有一个具有以下架构的用户个人资料模型:

  schema "user_profiles" do
    field :birthday, Ecto.Date
    field :gender, :string
    field :first_name, :string
    field :last_name, :string
    field :description, :string
    field :username, :string

    # Associations
    belongs_to :user, User

    timestamps
  end

我还有一个具有以下架构的位置模型:

  schema "locations" do
    field :name, :string
    field :admin_1, :string
    field :admin_2, :string
    field :country, :string
    field :country_abbreviation, :string
    field :code, :string
    field :latitude, :decimal
    field :longitude, :decimal

    timestamps
  end

位置是一个像法国巴黎的城市。许多用户配置文件可以与同一位置相关联。但是,一个位置并不需要知道存在用户配置文件。

我想在用户配置文件架构中添加位置关联。我不想使用has_one,因为这种关系不是一对一的。我不想在位置模式上向用户配置文件添加任何关联。

我查看了Ecto的文档,我对如何表达这种关联感到茫然。

我查阅了以下页面: https://hexdocs.pm/ecto/Ecto.Schema.html

我可能遗漏了一些基本的东西,但在提出这个问题之前,我确实尝试了不止一些事情。

1 个答案:

答案 0 :(得分:3)

一种解决方案是在配置文件属于关系的两个模型之间建立简单的has_many和belongs_to关系。

这种关系意味着一个位置可以有许多与之关联的配置文件,而一个配置文件只能有一个位置。

E.g。

  

作品:

     

Profile1:伦敦√

     

简介2:伦敦√

     

错误:

     

Profile1:London X

     

Profile1:France X

这就是你如何实施它。

#web/models/location.ex
schema "location" do
  has_many :profiles, MyApp.Profile
end

#web/models/profile.ex
schema "profile" do
  belongs_to :location, MyApp.Location
end

然后,在profile_table迁移中,您将拥有:

  

添加:location_id,引用(:locations)

您不需要位置模型上的外键,只需要配置文件模型。