2017-08-16 7 views
3

私はmany_to_manyの関連性を持つPhoenix Appを持っています。このアプリでは:Ecto/Phoenixのmany_to_many関係で関連テーブルのフィールドにアクセスするにはどうすればよいですか?

私は、ユーザーテーブルを持っている:

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

と組織テーブル:

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

は最後に、私はメンバーシップテーブルを持っている:

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

私の質問:メンバーオブジェクトからroleフィールドを取得する良い方法はありますか? 1つのSQLクエリ内の関連するオブジェクト?私はアソシエーションと関連するオブジェクトを2つの別々のクエリでクエリできることを理解していますが、よりクリーンな方法があるのだろうかと思っていました。

答えて

1

このようなことがお役に立てれますか?私がやりなさい はそれをテストし、それはあなたがプリロードクエリの考えを示しています。あなたは、ユーザーのメンバーシップをプリロードすることができるように

まずモデルにhas_manyメンバーシップのフィールドを追加します。

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

次にしてみてください次のようにリクエストしてください:

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 
関連する問題