在菲尼克斯的同一张桌子上多对多

时间:2017-10-08 03:27:51

标签: many-to-many elixir phoenix-framework ecto absinthe

使用Ecto v2.2.6,Phoenix 1.3

我有一张人(他们碰巧彼此有关系)的表格,以及另一张关于这些人的关系表。 relations表列出了一列中父节点的id,以及另一列中子节点的id。

mix phx.gen.json Accounts Person persons name:string age:integer
mix phx.gen.json Accounts Relationship relationships parent_id:references:persons child_id:references:persons

现在,我即将在关系模式中添加belongs_to关系(目前看起来像这样)

  schema "relationships" do
    field :parent_id, :id
    field :child_id, :id
    timestamps()
  end

但是没有明确设置id的能力,它看起来像这样(似乎不起作用)

  schema "relationships" do
    belongs_to :person UserRelations.Accounts.Person 
    belongs_to :person UserRelations.Accounts.Person 
    timestamps()
  end

如何编写关系模式以便捕获这些belongs_to关系?

修改

我已根据建议设置了这样的架构:

  schema "relationships" do
    belongs_to :parent UserRelations.Accounts.Person 
    belongs_to :child UserRelations.Accounts.Person 
    timestamps()
  end

我也试图用Person模式做类似的事情:

  schema "persons" do
    field :age, :integer
    field :name, :string
    many_to_many :parent_of, UserRelations.Accounts.Person, join_through: "relationships"
    many_to_many :child_of, UserRelations.Accounts.Person, join_through: "relationships"
    timestamps()
  end

但是,当我尝试访问这些关系时(我通过absinthe / graphql架构这样做),我发现它正在某个地方寻找person_id:

[error] Task #PID<0.400.0> started from #PID<0.395.0> terminating
** (Postgrex.Error) ERROR 42703 (undefined_column): column f2.person_id does not exist

1 个答案:

答案 0 :(得分:3)

  1. 两个belongs_to关系的名称需要不同。例如:

    belongs_to :child, UserRelations.Accounts.Person 
    belongs_to :parent, UserRelations.Accounts.Person 
    

    使用这些名称,Ecto将正确推断外键:child_idparent_id

  2. 对于many_to_many,您需要向两者提供join_keys,因为Ecto无法从关系名称和架构模块中推断出它。

    对于第一个,您需要添加:

    , join_keys: [parent_id: :id, child_id: id]
    

    第二个:

    , join_keys: [child_id: :id, parent_id: id]