2012-02-29 13 views

risposta

47

: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.

+4

Questa è una buona spiegazione. Sareste in grado di inviare una patch al progetto docrails spiegandola allo stesso modo? http://github.com/lifo/docrails. –

+0

Grazie! Ho cercato questo per molto tempo! –

+0

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} ' –

Problemi correlati