2011-08-01 2 views
2

사용자가 데이터를 가져 오는 xml 파일이 있습니다. 이 모델은 Player 모델의 레코드를 만듭니다. 동시에, 나는 Membership 협회에서 기록을 만들길 원합니다.find_or_initialize_by 및 has_many : through

위의 두 가지 모두 레코드가 아직 존재하지 않는 경우에만 트리거되어야합니다. 이 방법의 단축 버전입니다 :

@player = self.players.find_or_initialize_by_name_and_archetype(name, archetype) 
if @player.save 
    self.memberships.create(:player_id => @player.id) 
end 

이제 find_or_initialize_by 작동하지만 Membership 여전히 기본적으로 경우 조건을 무시하고, 각 플레이어 생성됩니다.

어떻게 간결한 방식으로이 작업을 수행 할 수 있습니까?

답변

2

이 찾기 또는 초기화에서 설정되면 새 레코드가 아니어도 save를 호출 할 수 있습니다. 객체를 찾음으로써 콘솔에서 시도해보십시오. 아무 것도 변경하지 않고 save on 그리고 유효한 객체 인 한 당신은 여전히 ​​사실이 될 것입니다. 말했다되고 그건

, 난 당신이 청소기 방법은 내가 self가에 누구 모르는에 회원으로 고유성 제약 조건을 추가하는 것입니다 이럴 당신의 상태가

if @player.new_record? && @player.save 
+0

친구에게 감사드립니다. 콘솔에서 사용해 보았지만 실제로 돌아 왔습니다. 어떤 이유로 레코드를 발견하고 초기화하지 않은 경우 저장이 거짓이라고 생각했습니다. – amunds

+0

'save'는 레코드가 유효하지 않음 (유효성 검사 기준) 만 false를 반환합니다. 그것이 다행했기 때문에. 건배. – theIV

1

의 라인을 따라 더되고 싶은 생각 그

class Team < ActiveRecord::Base 
has_many :memberships, :before_add => :validates_membership 

같은 코드 (A Team는?) 난 그냥 자동으로 데이터베이스 호출을 삭제하고 성공을보고 할 것입니다.

def validates_membership(membership) 
    raise ActiveRecord::Rollback if self.memberships.include? membership 
end 

ActiveRecord :: Rollback은 내부적으로 캡처되었지만 다시 올라 오지 않습니다.
그러면 self.memberships.create(:player_id => @player.id)을 호출 할 수 있으며 중복 된 회원 자격이 생성되지 않습니다.
원하는 경우 데이터베이스 수준 add_index :memberships, [ :team_id, :player_id ], :unique => true, :name => 'by_team_and_player에 고유성 제약 조건을 추가 할 수 있습니다.

마지막으로, 회원님의 고유성을 확인하기 위해 테스트를 추가 할 수 있습니다 (일부는 먼저해야한다고 말합니다).