2016-11-15 3 views
0

Ich habe eine many_to_many-Verknüpfung mit einem expliziten join_schema, das auf beiden Seiten auf das gleiche Modell verweist (Art des klassischen Follower (ist ein Benutzer) < -> Followee (ist ein Benutzer) Ding).Ecto: Join-Schema-Feld in many_to_many-Abfrage einfügen

Um bei dem Beispiel zu bleiben, wenn ich nach den Followern eines Benutzers abfrage, möchte ich die Zeit einschließen, wenn der Benutzer folgt. Diese Daten befinden sich offensichtlich im Join-Schema (nennen wir es Subscription).

Wenn würde nur die Anhänger wollen würde ich es tun, wie folgt:

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

Um diese Arbeit habe ich diese auf den Benutzer definiert haben würde:

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

Also lassen Sie uns sagen, es ist ein created_at Feld auf dem Modell Subscription. Wie würde ich fragen, um es zu bekommen?

Antwort

1

Da Sie bereits die Subscription Schema haben, können Sie eine has_many definieren:

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

Und dann die Abonnements erhalten mit:

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

follower_subscriptions wird dann eine Liste der Subscription sein, jede enthält created_at, 10, followee_id und follower_id.

Code nicht getestet; lass es mich wissen, wenn es einen Tippfehler gibt.

+0

Nun, ich hatte das schon, aber dachte, es wäre möglich, eine Liste von - in diesem Fall - Follower zu bekommen. Ich wollte es so, weil die Subskriptionsliste phoenix's 'render_many' zerbrach. Wie auch immer, ich versuchte es noch einmal und fand heraus, dass es den Schlüssel aus dem Schemanamen leitet, der offensichtlich nicht übereinstimmen wird, weil es ein "FollowerView" ist. Aber es gibt eine Möglichkeit, es explizit zu definieren. So Problem gelöst, thx! :) – fahrradflucht