2011-08-18 3 views
4

현재 사용자가 워크샵에 신청할 수있는 시스템을 구축 중입니다 ... 유일한 문제는 사용자가 여러 번 적용 할 수 있다는 것입니다. has_and_belongs_to_my 사용자가 워크샵에 여러 번 적용 할 수없는 유효성 확인

 #apply to workshop 
     def apply 
      @workshop = Workshop.find(params[:id]) 
      @workshop.users << @current_user 
      if @workshop.save 
      @workshop.activities.create!({:user_id => @current_user.id, :text => "applied to workshop"}) 
      flash[:success] = "You successfully applied for the workshop" 
      redirect_to workshop_path(@workshop) 
      else 
      flash[:error] = "You can't apply multiple times for the same workshop" 
      redirect_to workshop_path(@workshop) 
      end 
     end 

적용하기위한 코드 워크샵 모델은 다음을 확인 :

 has_and_belongs_to_many :users #relationship with users... 
     validate :unique_apply 
     protected 

     def unique_apply 
      if self.users.index(self.users.last) != self.users.length - 1 
      errors.add(:users, "User can't apply multiple times to a workshop") 
      end 
     end 

그리고 메시지가 "당신은 같은 여러 번 적용 할 수 있기 때문에 저장이 실패 워크숍 "이 나타납니다. 그러나 사용자는 여전히 워크샵에 참석자로 추가됩니까? 문제는 저장이 적용되기 전에 배열에 사용자가 이미 추가되었다는 것인데 저장이 실패하지만 사용자가 배열에서 제거되지 않는다고 생각합니다.

어떻게이 문제를 해결할 수 있습니까?

감사합니다.

마르셀

UPDATE 추가 된이 추한 충돌 있도록 데이터베이스에는 중복은, SQL 오류를 잡을 수 없습니다 레일에 루비하지가되도록 이동한다.

class UserWorkshop < ActiveRecord::Base 
     belongs_to :user 
     belongs_to :workshop 

     validates_uniqueness_of :user_id, :scope => :workshop_id 

    end 
: 대신 has_and_belongs_to_many 관계

이 결합 모델의 결합 모델을 작성

:

add_index(:users_workshops, [:user_id, :workshop_id], :unique => true) 

는 UPDATE 해결책

다음을 수행하여 문제를 해결

티 당신은 현재 모델에 고유성 확인을 할 수 있기 때문에 당신이 할 수없는

 has_many    :users,  :through => :user_workshops, :uniq => true 
     has_many    :user_workshops 

: 사용자에

: 워크샵에서

 has_many    :workshops,   :through => :user_workshops 
     has_many    :user_workshops 

의 다른 모델에 관계 정의입니다 has_and_belongs_to_many 관계에 대해 유일성을 검증하십시오. 이제 사용자와 워크샵에 참여하는 조인 모델이 있으므로 사용자와 워크샵의 관계는 동일하게 유지됩니다. 큰 차이점은 조인 모델에서 유효성 검사를 수행 할 수 있다는 것입니다. 이것은 정확히 우리가 원하는 것입니다. user_id per workshop_id 하나만 있는지 확인하고 싶습니다. 따라서 validates_uniqueness_of : user_id, : scope => : workshop_id

사례가 해결되었습니다.

P. 당신이 관계 (: user_workshops)를 별도의 has_many 관계로 언급했다는 것을주의 깊게 관찰하십시오. 그렇지 않으면 모델이 연관을 찾을 수 없습니다 !!

+0

PP로 디버깅 정보를 추가했습니다. 첫 번째 사용자는 한 명의 사용자를 추가하기 전의 사용자 수입니다. 두 번째는 한 사용자를 추가 한 것이고 세 번째는 저장 실패 인 경우입니다. 이 응답은 "현재 사용자" "추가 된 사용자 한 명" "저장에 실패했습니다" 4. 추가 된 사용자가 배열에 남아있게됩니까? –

+0

귀하의 사용자 모델 게시. – inntran

답변

0

"The Rails 3 Way"에 따르면 "has_and belongs_to_man"은 실질적으로 쓸모가 없습니다.

중간 테이블과 함께 has_many : through를 사용해야합니다.

+0

이것이 거의 불가능한 것 같아서 그렇게 할 것이라고 생각합니다. –