2012-02-29 19 views

Respuesta

47

:source_type se ocupa de las asociaciones que son polimórficas. Es decir, si tiene una relación como ésta:

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 

A continuación, el tipo de fuente le permite hacer consultas como esta:

"ME Encontrar todos los libros que han sido etiquetados con la etiqueta llamado 'diversión'"

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

sin tipo de fuente, que no sería capaz de hacer eso, sólo se podía obtener una colección de objetos que fueron marcados con 'diversión'. Si solo especificas la fuente, no sabría qué clase de clase eran los objetos, por lo que no sabrías en qué tabla del DB extraer. El source_type le informa de qué tipo de objeto está tratando de recuperar.

Esto está tomado de esta entrada del blog: http://www.brentmc79.com/posts/polymorphic-many-to-many-associations-in-rails

espero que ayude.

+4

Esta es una buena explicación. ¿Sería capaz de enviar un parche al proyecto docrails explicándolo de la misma manera? http://github.com/lifo/docrails. –

+0

¡Gracias! ¡He estado buscando esto por mucho tiempo! –

+0

Quiere decir que no sabría qué tipo de clase para una unión en una relación. Resolvería el tipo de clase de 'taggings.map {| link | link.taggable} ' –

Cuestiones relacionadas