Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 在EXTO中的“属于”关联中引用复合密钥?_Elixir_Ecto_Phoenix - Fatal编程技术网

Elixir 在EXTO中的“属于”关联中引用复合密钥?

Elixir 在EXTO中的“属于”关联中引用复合密钥?,elixir,ecto,phoenix,Elixir,Ecto,Phoenix,我试图将一个实体建模为仅附加,另一个子实体引用第一个实体。因此A的结构类似于(按DESC处插入的排序): (id,version)构成A的主键(也可以执行(id,inserted_at),但开发人员认为版本号更容易阅读) 现在B属于A,每个B都将与A的一对(id,version)对应 | id | a_id | a_version | column | inserted_at | |------|-------+-----------+---------+-------------| |

我试图将一个实体建模为仅附加,另一个子实体引用第一个实体。因此A的结构类似于(按DESC处插入的
排序):

(id,version)
构成A的主键(也可以执行
(id,inserted_at)
,但开发人员认为版本号更容易阅读)

现在B属于A,每个B都将与A的一对
(id,version)
对应

|  id  |  a_id | a_version |  column | inserted_at |
|------|-------+-----------+---------+-------------|
|   4  |   5   |    2      |  "pigs" | 2020-05-05  |
|   3  |   5   |    2      |  "goats"| 2020-05-03  |
|   2  |   5   |    1      |  "rams" | 2020-05-02  |
|   1  |   3   |    1      |  "bears"| 2020-04-18  |
我的问题是,我如何用外部模式对它们建模?我想通过阅读文档我知道A模式是什么样子的,除了
有很多

defmodule MyASchema do 
  use Ecto.Schema

  @primary_key false
  schema "table_a" do
    field :id, :id, primary_key: true
    field :version, :integer, primary_key: true
    field :column, :string
    field :inserted_at, :utc_datetime
    has_many :bs, MyBSchema  # what goes here for :foreign_key?
  end
end
但是B模式(特别是
属于
)对我来说不太清楚:

defmodule MyBSchema do 
  use Ecto.Schema

  @primary_key
  schema "table_b" do
    field :id, :id, primary_key: true
    field :column, :string
    field :inserted_at, :utc_datetime

    # how does belongs_to work here? would it be 
    #
    # belongs_to :a, MyASchema, primary_key: [:id, :version]
    #
    # or 
    #
    # belongs_to :a, MyASchema, define_key: false
    # field :a_id, :id
    # field :a_version, :integer
    #
    # ? If so, how could I query such that the :a field of the
    # struct is populated?
  end
end
很高兴进一步澄清,感谢阅读+任何帮助,根据,在使用关联时,Ecto不支持复合外键

一种解决方案是添加一个“常规”唯一主键(例如,一个自动递增的整数或UUID)并基于该id进行引用。有时,在处理数据库抽象层时,您会使用控制台,因为当数据库有一个简单的单列主键(即,不是复合主键)时,关系更容易定义


如果无法更改数据库模式,则需要手动解析代码中的关联。您可能需要按照所述设置多个事务。

次要更新:有人正在处理它!
defmodule MyBSchema do 
  use Ecto.Schema

  @primary_key
  schema "table_b" do
    field :id, :id, primary_key: true
    field :column, :string
    field :inserted_at, :utc_datetime

    # how does belongs_to work here? would it be 
    #
    # belongs_to :a, MyASchema, primary_key: [:id, :version]
    #
    # or 
    #
    # belongs_to :a, MyASchema, define_key: false
    # field :a_id, :id
    # field :a_version, :integer
    #
    # ? If so, how could I query such that the :a field of the
    # struct is populated?
  end
end