2009-03-31 17 views
8

Se si dispone di associazioni belongs_to polimorfici quindi riferimenti aggiungerà entrambe le colonne necessarie:polimorfico associazione

create_table :products do |t| 
    t.references :attachment, :polymorphic => {:default => 'Photo'} 
end 

aggiungerà una colonna attachment_id e una colonna di stringa attachment_type con un valore predefinito di ‘Photo’.

Cosa significa esattamente?

risposta

4

Fondamentalmente, l'associazione polimorfica per definizione aggiunge la capacità di creare associazioni con molti altri modelli di ActiveRecord di Rails.

Entrambe le colonne consentono a Rails di sapere a quale Modello si riferisce l'associazione, si dispone della colonna attachment_type (cioè String) (il valore predefinito è "Foto", nome tabella: foto nel db), e il attachment_id è un po 'come una chiave straniera per quel particolare modello/tabella (cioè foto).

In genere questo consente di associare un modello a molti altri.

0

polimorfico significa che può appartenere a oggetti diversi (o record diversi in tabelle diverse). Il modo in cui determina ciò è basato sui campi type e id. Se la tua associazione non era polimorfica, avrebbe solo un campo _id.

+0

Volevo solo sapere cosa succede a livello di database quando eseguo la migrazione. – Arc

6

Ecco la documentazione sul metodo riferimenti: http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M001938

Il codice del metodo di riferimento è il seguente:

497:  def references(*args) 
498:   options = args.extract_options! 
499:   polymorphic = options.delete(:polymorphic) 
500:   args.each do |col| 
501:   column("#{col}_id", :integer, options) 
502:   column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil? 
503:   end 
504:  end 

Come si può vedere. Aggiunge una colonna [col] _id e [col] _type alla tabella.

E 'lo stesso che dire:

create_table :products do |t| 
    t.integer :attachment_id 
    t.string :attachment_type, :default => 'Photo' 
end 

associazioni polimorfiche sono utilizzati per collegare un tipo di oggetti a più tipi di altri oggetti.

Un buon esempio potrebbe essere un'applicazione che supporta i tag, dove i tag possono essere collegati sia a Products e a Categories.

Nel tuo esempio, sembra che i Prodotti possano essere collegati a più tipi di oggetti, in cui il tipo di oggetto predefinito è una Foto. (attachment_type sarebbe "Foto" e attachment_id sarebbe un ID di una riga nella tabella "foto")

+0

colonna attachment_type Come si può capire che la colonna attachment_type debba essere utilizzata? – Arc

+0

fondamentalmente la magia delle rotaie –

Problemi correlati