현재 사용자가 워크샵에 신청할 수있는 시스템을 구축 중입니다 ... 유일한 문제는 사용자가 여러 번 적용 할 수 있다는 것입니다. 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 관계로 언급했다는 것을주의 깊게 관찰하십시오. 그렇지 않으면 모델이 연관을 찾을 수 없습니다 !!
PP로 디버깅 정보를 추가했습니다. 첫 번째 사용자는 한 명의 사용자를 추가하기 전의 사용자 수입니다. 두 번째는 한 사용자를 추가 한 것이고 세 번째는 저장 실패 인 경우입니다. 이 응답은 "현재 사용자" "추가 된 사용자 한 명" "저장에 실패했습니다" 4. 추가 된 사용자가 배열에 남아있게됩니까? –
귀하의 사용자 모델 게시. – inntran