O asociacích v Rails už jsem něco málo psal. Do nějakých obecných úvodních článků se mi nechce, spíše se znažím zachytit své aktuální potřeby a myšlenkové pochody. Dnes to bude o speciální variantě asociace has_many nazývané has_many :through.

Proč se o has_many :through mluví často jako o zvláštním typu asociace? HM:T se tak trochu svému názvu vymiká a z mého pohledu je to taková přijemná sestra has_many na půl cesty k asociaci has_and_belongs_to_many. M:N asociace jsou totiž většinou přesně ty, u kterých HM:T nejčasněji použijeme. Jako už tolikrát ohraná písnička o Značkách a Článcích.

class Tag
has_many :taggings
has_many :articles, :through => :taggings
end
class Tagging
belongs_to :tag
belongs_to :article
end
class Article
has_many :taggings
has_many :tags, :through => :taggings
end

HM:T má ale daleko více uplatnění. Obšírně bych je nazval tranzitivní asociace, to ze mě ale mluví matfyzák. Slušně řečeno, jde o takové asociace, kde dané modely nejsou přímo ve vzahu nebo kde neexistuje cizí klíč od jednoho k druhému, ale přesto nás daný vztah zajímá. Vezměte následující příklad z hudebního průmyslu:

class Band
has_many :cds
has_many :tracks, :through => :cds
end
class Cd
has_many :tracks
belongs_to :band
end
class Track
belongs_to :cd
end

V tomto případě máme vtah Band:Track typu 1:N, ale HM:T si tu pořád najde uplatnění. Ona tranzitivnost znamená to, že Band a Track nejsou ve vztahu přímo (z pohledu databáze), ale pouze prostřenictvím modelu Cd.

Zajímavá zákoutí Rails se začnou objevovat, když poslední příklad trošku rozšíříme. Tento článek už by ale na mě byl moc dlouhý takže se k HM:T vrátím zítra.

Komentáře

K tomuto postu je 0 komentářů. Přidej vlastní →

Přidej komentář

Povinná pole jsou vyznačena tučně.