10

Wie kann ich einen anderen Tabellennamen durch Hinzufügen eines Fremdschlüssels zuweisen? für zSo fügen Sie einen Fremdschlüssel in der Schienenmigration mit einem anderen Tabellennamen hinzu

Ich habe ein Modell wie

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

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

Jetzt will ich wie diese meine Migrationsdatei ändern:

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 

Aber es funktioniert nicht. Die Migration wird abgebrochen. Wie ändere ich meine Migrationsdatei, um mit meiner Modellstruktur zu arbeiten?

+1

't.belongs_to: post, Index: true' für Sie den Fremdschlüssel erstellt . Warum versuchst du es wieder? Ich bekomme nicht, was Sie versuchen zu tun. –

+0

Was ist der Fehler, der durch Ihre Migration erzeugt wird? – nayiaw

Antwort

0

Versuchen Sie, diese

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' verwendet den Standardtabellennamen. Die Frage ist alles über "verschiedenen Tabellennamen": Es muss 't.references: post' – Djunzu

10

Es sollte wie folgt aussehen:

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 

Werfen Sie einen Blick in die Dokumentation: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key

Sie verwenden die column Option, wenn die Spalte unterschiedlich benannt wird.

13

Sie in den Optionen für den Fremdschlüssel passieren kann, wie folgend:

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 

Dies ist auch für die Indexoption wahr, wenn Sie eine eindeutige Einschränkung hinzufügen:

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

Btw .: references ist ein Alias ​​für objects_to, genauer gesagt, gehört_o ist ein Alias ​​für Referenzen.

Siehe die Details bei der Umsetzung:

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

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

+2

' index' ist 'true' standardmäßig. 'index: true' ist nicht notwendig. – developer033

+2

['index' ist standardmäßig 'true' von Rails 5] (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-addreference). ['index' ist in früheren Rails-Versionen standardmäßig 'false' (http://api.rubyonrails.org/v4.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-addreference). – cbliard

Verwandte Themen