: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.
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. –
Dzięki! Szukałem tego od dawna! –
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} ' –