2011-06-12 81 views
0

說,我有一個模型如何添加索引有條件

class Post < ActiveRecord::Base 
    validates_uniqueness_of :title, :unless => Proc.new {|p| p.deleted?} 
end 

的約束是我只能有1個職位有「foobar的」爲題,而它的不被刪除,1+職位,這些都是有被刪除是真實的,也有「foobar」作爲他們的頭銜。由於ActiveRecord不能保證從this link標題的唯一性,我試圖添加一個唯一的索引到表格的帖子上,列[:title,:deleted],它會失敗的場景,當我嘗試插入一個新的刪除發佈到數據庫。

回答

0

在大多數數據庫中不可能有條件數據庫索引,例如MySQL的。

如果您絕對必須保證唯一性,最好的選擇可能是將已刪除的帖子單獨列出。主表上有唯一索引,但不包含已刪除記錄的表。您最終將得到一個較小的帖子表和更簡單的編碼 - 不再需要在任何查詢中過濾掉已刪除的帖子。

你有沒有考慮過如果你取消刪除一個帖子會發生什麼 - 兩個帖子可以有相同的標題?

一些其他的選項有:

  1. 變化,當你刪除帖子的標題,例如添加一個時間戳。
  2. 如果可以找到2個或更多相同標題的實例,則在保存模型後引發異常。
  3. 保存之前鎖定整個表格(悲觀鎖定)。
  4. 只是希望它的工作原理(你多久將會有兩個人張貼在準確的同一時間同一個標題?)
0

有可能在PostgreSQL的

add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)"