我想在Ruby on Rails遷移腳本中建立一個unique
的列。 最好的方法是什麼? 還有一種方法能夠索引表中的列嗎? 數據庫
我想在數據庫中強制使用unique
列,而不是僅使用:validate_uniqueness_of
。 api
簡短的回答: 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
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
我正在使用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
您可能但願爲惟一鍵添加名稱,由於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
因爲還沒有說起但回答了我在找到此頁面時遇到的問題,您還能夠指定索引在經過t.references
或t.belongs_to
添加時應該是惟一的:
create_table :accounts do |t| t.references :user, index: { unique: true } # or t.belongs_to # other columns... end
(截至至少Rails 4.2.7
)