2016-11-15 4 views
0

私は、両端の同じモデルを参照する明示的なjoin_schemaとのmany_to_manyの関連付けを持っています(クラシックフォロワー(ユーザ))< - >フォロイ物)。Ecto:many_to_manyクエリで結合スキーマフィールドを含める

私がユーザーのフォロワーを照会すると、ユーザーにフォローしている時間を含める場合、この例に固執する。このデータは明らかに結合スキーマにあります(呼び出しはSubscriptionです)。

ちょうど私がこのようにそれを行うだろう信者たい場合:この作業を持っているために

followers = User 
|> Repo.get!(user_id) 
|> assoc(:followers) 
|> Repo.all() 

を、私は、ユーザーにこれを定義しているだろう:

many_to_many(
    :followers, 
    MyApp.User, 
    join_through: MyApp.Subscription, 
    join_keys: [followee_id: :id, follower_id: :id] 
) 

それではがあるとしましょうSubscriptionモデルのcreated_atフィールド。それを取得するために私はどのようにクエリしますか?

答えて

1

すでにSubscriptionスキーマを持っているので、あなたはhas_manyを定義することができます。

schema "users" do 
    ... 
    has_many :follower_subscriptions, MyApp.Subscription, foreign_key: :followee_id 
    has_many :followee_subscriptions, MyApp.Subscription, foreign_key: :follower_id 
end 

そして使用してサブスクリプションを取得:

follower_subscriptions = User 
|> Repo.get!(user_id) 
|> Repo.preload(follower_subscriptions: :follower) 
|> Repo.all() 

follower_subscriptionsを、その後それぞれが含む、Subscriptionのリストになりますcreated_at,​​,followee_idおよびfollower_id

コードがテストされていません。タイプミスがある場合は教えてください。

+0

私はこれを既に持っていましたが、このケースではフォロワーのリストを得ることは可能かもしれないと考えました。サブスクリプションリストがphoenixの 'render_many'を壊してしまったので、私はこの方法を望んでいました。 とにかくもう一度試してみましたが、それは "FollowerView"なので明らかに一致しないスキーマ名のキーを推測することがわかりました。しかし、明示的に定義する方法があります。 問題は解決しました。 :) – fahrradflucht

関連する問題