2017-10-07 5 views
0

Utilisation Ecto v2.2.6, Phoenix 1.3associations multiples sur le même schémas

J'ai un scénario dans lequel un utilisateur peut créer des postes, et d'autres utilisateurs peuvent aimer les messages. Les utilisateurs ont une relation un-à-plusieurs avec les messages via la création, et une relation plusieurs-à-plusieurs avec les likes, via une table de liaison.

Configuration:

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 

schemas:

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 

Quand je lance mix phx.server, je reçois cette erreur:

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

Est-il possible que je peux définir plus d'une association au même schéma, mais dans un contexte différent?

Répondre

1

Is there a way that I can set up more than one association to the same schema, but through a different context?

Oui, mais vous devrez choisir un nom différent pour les deux associations, comme ceci:

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

Vous ne devriez pas avoir besoin de modifier quoi que ce soit dans Post depuis Post utilise déjà des noms différents pour les deux associations.