如何使列惟一併在Ruby on Rails遷移中將其編入索引?

我想在Ruby on Rails遷移腳本中建立一個unique的列。 最好的方法是什麼? 還有一種方法能夠索引表中的列嗎? 數據庫

我想在數據庫中強制使用unique列,而不是僅使用:validate_uniqueness_ofapi


#1樓

簡短的回答: less

add_index :table_name, :column_name, unique: true

要將多個列索引在一塊兒,能夠傳遞一組列名而不是一個列名, spa

add_index :table_name, [:column_name_a, :column_name_b], unique: true

對於更細粒度的控制,有一個執行直接SQL的「 execute 」方法。 code

而已! 索引

若是您這樣作是爲了替代常規的舊模型驗證,只需檢查它是如何工做的。 我不肯定向用戶報告的錯誤是否會很好。 你能夠隨時作到這兩點。 get


#2樓

rails生成遷移add_index_to_table_name column_name:uniq string

要麼 io

rails生成遷移add_column_name_to_table_name column_name:string:uniq:index table

生成

class AddIndexToModerators < ActiveRecord::Migration
  def change
    add_column :moderators, :username, :string
    add_index :moderators, :username, unique: true
  end
end

若是要向現有列添加索引,請刪除或註釋add_column行,或進行檢查

add_column :moderators, :username, :string unless column_exists? :moderators, :username

#3樓

我正在使用Rails 5,上面的答案頗有用; 這是另外一種對我:email_address的方法(表名是:people列名是:email_address

class AddIndexToEmailAddress < ActiveRecord::Migration[5.0]
  def change
    change_table :people do |t|
      t.index :email_address, unique: true
    end
  end
end

#4樓

您可能但願爲惟一鍵添加名稱,由於rails的默認unique_key名稱可能太長,DB可能會拋出錯誤。

要爲索引添加名稱,只需使用name:選項。 遷移查詢可能看起來像這樣 -

add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'

更多信息 - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index


#5樓

因爲還沒有說起但回答了我在找到此頁面時遇到的問題,您還能夠指定索引在經過t.referencest.belongs_to添加時應該是惟一的:

create_table :accounts do |t|
  t.references :user, index: { unique: true } # or t.belongs_to

  # other columns...
end

(截至至少Rails 4.2.7

相關文章
相關標籤/搜索