M.Hartl -> has_many :following, through: -> czy dobrze to rozumiem?

Witam koledzy i koleżanki,

Czy mógłbym Was poprosić o pomoc i dokładne wytłumaczenie asocjacji “has_many through” z przykładu M.Hartla.
Oczywiście rozumiem jak działa asocjacja jeden do jednego, jeden do wielku czy wiele do wielu ale przerabiając materiał z książki Hartla doszedłem do ostatniego rozdziału i chyba nie do końca rozumiem co się tam dzieje.

Przykład tłumaczy asocjację między modelem User i Relationship czyli twitterowy following/followed.

class User < ApplicationRecord
  has_many :active_relationships,  class_name:  "Relationship",
                                   foreign_key: "follower_id",
                                   dependent:   :destroy
  has_many :passive_relationships, class_name:  "Relationship",
                                   foreign_key: "followed_id",
                                   dependent:   :destroy
  has_many :following, through: :active_relationships,  source: :followed
  has_many :followers, through: :passive_relationships, source: :follower
  .
  .
  .
end

class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

Czy :active_relationships, :passive_relationships, :following, :followers traktowane są jakie jakieś wirtualne modele?
Nie bardzo rozumiem skąd się to wzięło i jak to sobie poukładać w głowie.

Przeczytałem, jak mi się wydaje, ze zrozumieniem http://guides.rubyonrails.org/association_basics.html i jedyne co mogło by mi pasować do tego przykładu to “Self Joins” ale te asocjajce nie są wykonywane na tym samym modelu.

Czy ktoś będzie tak uprzejmy i wytłumaczy mi, jak mam to rozumieć.

Z góry dziękuję za pomoc.

W zeszłym tygodniu na “Ruby Weekly” był artykuł nt. asocjacji. Doczytaj fragment na temat “Multi Transitive Associations”. Myślę że całkiem dobrze jest wyjaśniony case który wkleiłeś.

Link:

Po krótce, chodzi o to, że user możę mieć dwa typy asocjacji z innymi userami. W łatwy sposób możesz wywołać na instancji User’a following i pokaże Ci tych userów których śledzisz przez tabele active_relationships i analogicznie do followers.

Możesz też np w logach sprawdzić co się dzieje jeśli jeden user “śledzi” innego i zobaczyć jakie rekordy tworzą się w poszczególnych tabelach. Warto też sprawdzić w logach jak wygląda zapytanie SQL gdy wywołujesz metode #following na instancji user’a.

1 Like