Rails: "t.references" не работает при создании индекса

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

приводит к:

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'

Я думал, что t.references должен был обработать это для меня?

Ответ 1

Вы забыли добавить "_id" следующим образом:

add_index :ballots, :user_id

или, если вы хотите, чтобы он автоматически индексировался:

t.references :user, index: true

Дополнительная информация: add_index, references

НТН

Ответ 2

Ответ выше правильный, но имейте в виду, что:

t.references :user, index: true доступен только в Rails 4.0 и выше.

В более ранних версиях Rails (3.x), index: true будет терпеть неудачу, оставив вас без индекса в этой таблице. Для Rails 3.2.x и ниже используйте старый синтаксис:

add_index :ballots, :user_id

Или полностью используя ваш пример:

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