2011-06-12 5 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] 열에 고유 한 색인을 추가하려고합니다. 새 색인을 삽입하려고하면 시나리오가 실패합니다. DB에 게시하십시오.

답변

0

대부분의 데이터베이스에 조건부 데이터베이스 색인을 포함 할 수 없습니다. MySQL.

고유성을 절대적으로 보장해야하는 가장 좋은 방법은 삭제 된 게시물을 별도의 테이블로 만드는 것입니다. 기본 테이블에는 고유 색인이 있지만 h 제된 레코드가 들어있는 테이블에는 없습니다. 더 작은 포스트 테이블과 간단한 코딩으로 끝날 것입니다 - 더 이상 쿼리에서 삭제 된 게시물을 필터링 할 필요가 없습니다.

게시물을 삭제 취소하면 두 개의 게시물의 제목이 같을 수 있습니다.

몇 가지 다른 옵션은 다음과 같습니다 예를 들어,

  1. 변경 당신이 게시물을 삭제 제목, 타임 스탬프를 추가하십시오.
  2. 동일한 제목의 인스턴스가 두 개 이상있는 경우 모델 저장 후 예외가 발생합니다.
  3. 저장하기 전에 전체 테이블을 잠급니다 (비관적 잠금).
  4. 그냥 (얼마나 자주 두 사람이 동일한 시간에 같은 제목을 게시해야 할 것?) 작동 희망
0

는 PostgreSQL을에 가능

add_index :table_name, :columns, unique: true, where: "(deleted_at IS NULL)" 
관련 문제