DBテーブルの列の一つに UNIQUE制約をつけたい。Rails(ActiveRecord)自体はそんな機能は無いみたい。create_table や add_column のオプションに、:null みたいな感じで :unique とか設定できたらいいのに。
基本は validate_uniqueness_of宣言の方でチェックしなさいという事なのかな。
あとは add_index のオプションには :unique => true というのが可能なのでそっちか。
create_tableメソッドの optionsハッシュ引数には、:optionsというキーがあってそこに SQL が掛けるんだけど、それでやるのは反則だよな。
def self.up create_table :days , :options => '; ALTER TABLE days ADD UNIQUE (date);' do |t| t.date :date, :null => false t.timestamps end end
テーブル作成の :option は、「CREATE TABLE days (<云々>)」の「)」の後にただ繋がってくるので、テーブル制約として「UNIQUE (date)」と書いてもエラーになる。ALTER で、しかも頭に「;」とか、やっぱ反則だよな。
その制約は「"days_date_key" UNIQUE, btree (date)」
一方 add_index だと
def self.up create_table :days do |t| t.date :date, :null => false t.timestamps end add_index :days, :date, :unique => true end
その制約は「"index_business_days_on_date" UNIQUE, btree (date)」
制約名がちょっと違ってくるけどユニークネスについては同様なのでこっちを使うのが想定されてるのでしょう、きっと。