2013-07-04 31 views
12
class CreateBallots < ActiveRecord::Migration 
    def change 
    create_table :ballots do |t| 
     t.references :user 
     t.references :score 
     t.references :election 
     t.string :key 
     t.timestamps 
    end 
    add_index :ballots, :user 
    add_index :ballots, :score 
    add_index :ballots, :election 
    end 
end 

Ergebnisse bei der Schaffung von:Rails: "t.references" funktioniert nicht, wenn Index

SQLite3::SQLException: table ballots has no column named user: CREATE INDEX "index_ballots_on_user" ON "ballots" ("user")/home/muhd/awesomevote/db/migrate/20130624024349_create_ballots.rb:10:in `change' 

ich t.references dachte sollte das für mich zu handhaben?

Antwort

27

Sie haben vergessen "_id" wie folgt hinzuzufügen:

add_index :ballots, :user_id 

oder, wenn Sie es automatisch indiziert werden soll:

t.references :user, index: true 

Weitere Informationen: add_index, references

HTH

+0

Ah, okay. Ich hätte gedacht, dass die gleiche Syntax zwischen t.references und add_index verwendet würde, aber ich denke, das ist hier nicht der Fall. Danke für den Tipp für 'index: true'; Ich wusste nichts davon. – Muhd

+0

Ja, es ist nicht wirklich offensichtlich, aber "t.references" verweist auf den "Benutzer", indem er die Spalte "user_id" hinzufügt :) –

13

Die obige Antwort ist richtig, aber beachten Sie:

t.references :user, index: true nur verfügbar ist, in Rails 4.0 & up.

In früheren Versionen von Rails (3.x), wird index: true unbemerkt fehlschlagen, können Sie ohne einen Index für die Tabelle zu verlassen. Für Rails 3.2.x & unten verwenden the older syntax:

add_index :ballots, :user_id

weise oder vollständig mit Ihrem Beispiel:

class CreateBallots < ActiveRecord::Migration 
    def change 
    create_table :ballots do |t| 
     t.references :user 
     t.references :score 
     t.references :election 
     t.string :key 
     t.timestamps 
    end 
    add_index :ballots, :user_id 
    add_index :ballots, :score_id 
    add_index :ballots, :election_id 
    end 
end