2016-11-15 70 views
0

我有一個顯式join_schema關聯,它在兩端都引用相同的模型(類似於傳統追隨者(是用戶)< - > Followee(是一個用戶)事情)。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] 
) 

所以我們可以說是有created_at字段上的Subscription模型。我將如何查詢以獲得它?

回答

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_idfollower_id

代碼未經測試;讓我知道是否有錯字。

+0

嗯,我已經這樣做了,但認爲這將有可能獲得一個列表 - 在這種情況下 - 追隨者。我想這樣,因爲訂閱列表打破了Phoenix的'render_many'。 無論如何,我再次嘗試了一次,發現它從模式名稱中推斷了鍵,這顯然不匹配,因爲它是「FollowerView」。但是有一種方法可以明確定義它。 所以問題解決了,thx! :) – fahrradflucht