:source_type
si occupa di associazioni che sono polimorfiche. Vale a dire, se si dispone di un rapporto come questo:
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
Poi il tipo di origine consente di effettuare query come questo:
"Find Me tutti i libri che sono stati taggati con il tag chiamato 'Fun'"
tag = tag.find_by_name('Fun')
tag.books
senza tipo di origine, non sarebbe in grado di farlo, si potrebbe ottenere solo una collezione di oggetti che sono stati taggati con 'Fun'. Se si specifica solo l'origine, non saprebbe quale tipo di classe erano gli oggetti, quindi non si saprebbe da quale tabella del DB si desidera prelevare. source_type
Informa di quale tipo di oggetto si sta tentando di recuperare.
questo è preso da questo post del blog: http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails
Speranza che aiuta.
Questa è una buona spiegazione. Sareste in grado di inviare una patch al progetto docrails spiegandola allo stesso modo? http://github.com/lifo/docrails. –
Grazie! Ho cercato questo per molto tempo! –
Vuoi dire che non saprebbe quale tipo di classe per un join in una relazione. Troverà il tipo di classe da 'taggings.map {| link | link.taggable} ' –