相同模式上的多个关联

时间:2017-10-07 13:26:48

标签: schema elixir phoenix-framework ecto

使用Ecto v2.2.6,phoenix 1.3

我有一个用户可以创建帖子的场景,然后其他用户可以喜欢帖子。用户通过创建与帖子建立一对多的关系,并通过链接表与喜欢的多对多关系。

设定:

mix phx.gen.json Account User users name:string
mix phx.gen.json Content Post posts title:string content:text user_id:references:users
mix phx.gen.json Content Like likes user_id:references:users post_id:references:posts

架构:

  schema "users" do
    field :name, :string

    has_many :posts, SocialNetwork.Content.Post, foreign_key: :users_id
    many_to_many :posts, SocialNetwork.Content.Post, join_through: "likes"

    timestamps()
  end

  schema "posts" do
    field :content, :string
    field :title, :string

    belongs_to :user, SocialNetwork.Accounts.User
    many_to_many :users, SocialNetwork.Accounts.User, join_through: "likes"

    timestamps()
  end

  schema "likes" do
    belongs_to :user, SocialNetwork.Accounts.User
    belongs_to :post, SocialNetwork.Content.Post

    timestamps()
  end

当我运行mix phx.server时,我收到此错误:

== Compilation error in file lib/social_network/account/user.ex ==
** (ArgumentError) field/association :posts is already set on schema

有没有办法可以为同一架构设置多个关联,但是通过不同的上下文?

1 个答案:

答案 0 :(得分:1)

  

有没有办法可以为同一架构设置多个关联,但是通过不同的上下文?

是的,但您必须为这两个协会选择不同的名称,如下所示:

has_many :posts, SocialNetwork.Content.Post, foreign_key: :users_id
many_to_many :liked_posts, SocialNetwork.Content.Post, join_through: "likes"

您不应该修改Post中的任何内容,因为Post已经为这两个关联使用了不同的名称。