2012-02-29 11 views

Odpowiedz

47

:source_type dotyczy stowarzyszeń, które są polimorficzne. To znaczy, jeśli mają związek takiego:

class Tag < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :books, :through => :taggings, :source => :taggable, :source_type => "Book" 
    has_many :movies, :through => :taggings, :source => :taggable, :source_type => "Movie" 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :taggable, :polymorphic => true 
    belongs_to :tag 
end 

class Book < ActiveRecord::Base 
    has_many :taggings, :as => :taggable 
    has_many :tags, :through => :taggings 
end 

class Movie < ActiveRecord::Base 
    has_many :taggings, :as => :taggable 
    has_many :tags, :through => :taggings 
end 

Wtedy typ źródła pozwala na wykonywanie zapytań jak to:

„Znajdź mi wszystkie książki, które zostały oznaczone z tagiem nazwany „zabawy””

tag = tag.find_by_name('Fun') 
tag.books 

Bez typu źródła, nie byłby w stanie to zrobić, można dostać tylko zbiór obiektów, które zostały oznaczone tagiem«Fun». Gdybyś tylko określił źródło, nie wiedziałby, jakiego rodzaju klasy obiekty były, więc nie wiedziałbyś, z której tabeli w DB pobierać. source_type Informuje o tym rodzaju obiektu, który próbujesz odzyskać.

To jest wzięte z tym blogu: http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails

Nadzieję, że to pomaga.

+4

To jest dobre wytłumaczenie. Czy mógłbyś przesłać łatkę do projektu docrails wyjaśniając to w ten sam sposób? http://github.com/lifo/docrails. –

+0

Dzięki! Szukałem tego od dawna! –

+0

Masz na myśli, że nie będzie wiedział, jakiego rodzaju klasy do związku w związku. Oblicza typ klasy z 'taggings.map {| link | link.taggable} ' –

Powiązane problemy