2013-04-30 11 views
22

Stavo leggendo le Guide Rails e ho trovato queste righe di codice:t.referenze nella migrazione contro appartiene_a nel modello?

class CreateComments < ActiveRecord::Migration 
    def change 
     create_table :comments do |t| 
      t.string :commenter 
      t.text :body 
      t.references :post 

      t.timestamps 
     end 

     add_index :comments, :post_id 
    end 
end 

Ho anche letto il libro di Michael Hartl, Rails Tutorial e non ho trovato nulla sui "t.references" utilizzati nel codice sopra . Cosa fa? Nel libro di Michael ho usato has_many e appartiene_per le relazioni nel modello e nulla nelle migrazioni (non evento t.belongs_to).

+0

Possibile duplicato di http://stackoverflow.com/questions/7788188/che-è-la-differenza-tra-tradi-informazioni-e--t-referenze-in-rails – sameers

+0

@samai non proprio, il un altro sta chiedendo il 'belongs_to' nelle migrazioni non nei modelli –

risposta

26

Questa è un'aggiunta abbastanza recente a Rails, quindi potrebbe non essere inclusa nel libro che menzioni. Puoi leggere a riguardo in the migration section delle guide di Rails.

Quando si genera utilizzando, per esempio,

rails generate model Thing name post:references 

... la migrazione creerà il campo chiave esterna per voi, così come creare l'indice. Questo è ciò che fa t.references.

Si potrebbe avere scritto

rails generate model Thing name post_id:integer:index 

e ottenuto lo stesso risultato finale.

+0

Ma è ancora accettabile aggiungere una chiave straniera alla vecchia maniera? (usando appartiene_nel MODELLO) –

+2

Aggiungendo una chiave esterna al modello, non al database sottostante Dovrai farlo comunque. Se generi il tuo modello usando 'post: references', però, il generatore aggiungerà' belongs_to: post' automaticamente. –

+3

Per inciso, puoi effettivamente usare 'belongs_to' nella migrazione - è un alias di' references' – MrTheWalrus

5

Vedere this section delle guide di rotaia.

Nel tuo caso, t.references crea una colonna nella tabella comments. Ciò significa che Comment appartiene a Post, quindi nel modello Comment devi aggiungere belongs_to :post e nel modello Post: has_many :comments.

+0

Divertente, ma la sezione in realtà non menziona il metodo esatto "t.references". – Fritzz

Problemi correlati