2017-08-16 6 views
3

J'ai une application Phoenix qui a une association many_to_many. Dans cette application:Comment accéder aux champs de la table d'association dans many_to_many relations dans Ecto/Phoenix?

J'ai une table utilisateur:

schema "users" do 
    field :username, :string 
    many_to_many :organizations, Organization, join_through: "memberships" 
end 

et une table d'organisation:

schema "organization" do 
    field :org_name, :string 
    many_to_many :members, Users, join_through: "memberships" 
end 

Enfin, je la table adhésions:

schema "memberships" do 
    field :role, :string 
    belongs_to :organization, Organization 
    belongs_to :user, User 
end 

Ma question : Existe-t-il un moyen agréable de récupérer le champ role à partir de l'objet d'appartenance, et le Objets associés dans une seule requête SQL? Je comprends que je peux interroger les associations et les objets associés dans deux requêtes distinctes, mais je me demandais s'il y avait une manière plus propre de le faire.

Répondre

1

Est-ce que quelque chose comme ça vous aider? Je havn't testé, mais il vous montre l'idée d'une requête de pré-charge:

d'abord ajouter un champ has_many des adhésions à votre modèle afin que vous puissiez précharger les adhésions d'un utilisateur:

schema "users" do 
    field :username, :string 
    many_to_many :organizations, Organization, join_through: "memberships" 
    has_many: :memberships, Membership # <- add this line 
end 

Ensuite, essayez une demande comme suit:

import Ecto.Query 

organization_id = ... 

members_query = 
    from u in User, 
    join: m in Membership, 
    on: m.user_id == u.id and m.organization_id == ^organization_id, 
    preload: [memberships: m] 

query = 
    from o in Organization, 
    where: o.id == ^organization_id, 
    preload: [members: ^members_query] 

query |> YourApp.Repo.all