2015-08-25 11 views
6

Ich habe eine schöne Möglichkeit gefunden, Join-Tabellen für meine HABTM-Beziehungen in meiner Rails-App zu generieren.Was ist das Verhalten von create_join_table von ActiveRecord :: Migration?

rails g migration CreateJoinTable table1 table2 

Dies erzeugt eine ActiveRecord::Migration, die die Methode funktioniert create_join_table

Ich frage mich, was diese wunderbare geheimnisvolle Methode beschäftigt. Ich denke, es macht eine Tabelle (wahrscheinlich ohne ein Feld id), die eine Spalte für Fremdschlüssel Tabelle1 und eine Spalte für Fremdschlüssel Tabelle2 hat, aber hat die Tabelle andere Features ?. Meine Gewohnheit für Join-Tabellen war immer, einen eindeutigen Index für diese beiden Spalten hinzuzufügen, so dass eine Beziehung zwischen einem Datensatz in Tabelle1 und einem Datensatz in Tabelle2 nicht zweimal eingegeben werden kann.

Meine Frage läuft auf: Wenn ich create_join_table verwende, muss ich diesen einzigartigen Index hinzufügen, oder tut diese Methode das für mich (ich denke, dass es sollte)?

Die documentation I usually look at geht nicht in diese Art von Detail.

Antwort

0

Es stellt sich heraus, dass es nicht mehr tut als die Grundlagen, die ich in der Frage beschrieben habe. Ich fand das einfach aus, indem Sie die Migration laufen und zu sehen, was in endet db/schema.rb

Für Interessenten, die einen eindeutigen Index tun dies zu erhalten:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users 
    add_index :posts_users, [:post_id, :user_id], unique: true, name: 'index_posts_users' 
    end 
end 
3

ohne Block aufgerufen, create_join_table schafft nur eine Tabelle mit zwei Fremdschlüssel, die sich auf die zwei verbundenen Tabellen beziehen.

Sie können jedoch einen Block übergeben, wenn Sie die Methode aufrufen, um zusätzliche Operationen auszuführen (z. B. Hinzufügen von Indizes). Von der Rails doc:

create_join_table :products, :categories do |t| 
    t.index :product_id 
    t.index :category_id 
end 

Werfen Sie einen Blick auf create_join_table documentation.

Sie können den create_join_table Code an der Unterseite überprüfen (klicken Sie auf Quelle: Erscheinen).

1

SchemaStatements#create_join_table() schafft nur Tabelle ohne Phantasie Indizes verbinden usw. ... Also, wenn Sie wollen, müssen Sie auf zwei Feldern Einzigartigkeit Einschränkung verwenden, um so etwas tun:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :posts, :users do |t| 
     t.integer :post_id, index: true 
     t.integer :user_id, index: true 
     t.index [:post_id, :user_id], name: 'post_user_un', unique: true 
    end 
    end 
end 

Bitte beachten Sie auch, dass create_join_table erstellt standardmäßig kein id Feld.

Verwandte Themen