10

Come posso assegnare un nome di tabella diverso con l'aggiunta di chiave esterna. per esCome aggiungere chiave esterna nella migrazione di rotaie con nome tabella diverso

Ho un modello come

class MyPost < ActiveRecord::Base 
    has_many :comments, class_name: PostComment 
end 

class PostComment < ActiveRecord::Base 
    belongs_to :post, class_name: MyPost 
end 

ora voglio cambiare il mio file di migrazione in questo modo:

class CreatePostComments < ActiveRecord::Migration 
    def change 
    create_table :post_comments do |t| 
    t.belongs_to :post, index: true 
    t.timestamps null: false 
    end 
    add_foreign_key :post, :class_name => MyPost 
    end 
end 

Ma non sta funzionando. La migrazione è stata annullata. Come posso cambiare il mio file di migrazione per lavorare con la mia struttura del modello.

+1

't.belongs_to: posta, indice: true' creato la chiave esterna per voi . Perché stai ancora provando? Non riesco a ottenere quello che stai cercando di fare .. –

+0

Qual è l'errore generato dalla tua migrazione? – nayiaw

risposta

0

Prova questa

class CreatePostComments < ActiveRecord::Migration 
    def change 
    create_table :post_comments do |t| 
     t.references :my_post, index: true 
     t.timestamps null: false 
    end 
    add_foreign_key :my_post, :post_comments 
    end 
end 
+0

't.references: my_post' usa il nome della tabella di default. La domanda riguarda "il nome di una tabella diversa": deve essere "t.references: post' – Djunzu

10

dovrebbe apparire come questo:

class CreatePostComments < ActiveRecord::Migration 
    def change 
    create_table :post_comments do |t| 
    t.belongs_to :post, index: true 
    t.timestamps null: false 
    end 
    add_foreign_key :post_comments, :my_posts, column: :post_id 
    end 
end 

Date un'occhiata alla documentazione: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key

si utilizza l'opzione column quando la colonna si chiama in modo diverso.

13

È possibile passare a opzioni per la chiave esterna come segue:

class CreatePostComments < ActiveRecord::Migration 
    def change 
    create_table :post_comments do |t| 
     t.references :post, foreign_key: { to_table: :my_posts }, index: true 
     t.timestamps null: false 
    end 
    end 
end 

Questo è vero anche per l'opzione di indice, se volete aggiungere un vincolo univoco:

t.references :post, foreign_key: { to_table: :my_posts }, index: { unique: true} 

Btw .: reference è un alias per belongs_to, o per essere più precisi, belongs_to è un alias per riferimenti.

vedano i dettagli nella realizzazione:

rotaie 5.0.rc2: https://github.com/rails/rails/blob/v5.0.0.rc2/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L68

Rails 4.2: https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L312

+2

" index "è' true' di default. 'index: true' non è necessario. – developer033

+2

['index' è' true' di default da Rails 5] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference). ['index' è' false'di default nelle precedenti versioni di Rails] (http://api.rubyonrails.org/v4.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference). – cbliard

Problemi correlati