2014-02-11 4 views
3

일대일 관계가있는 사용자 및 프로필 객체가 있습니다. 프로필 개체에는 facebook_id 매개 변수가 있습니다. 지정된 facebook_id를 가진 프로필이 이미 데이터베이스에 존재하지 않는 한 사용자를 생성하고 해당 속성을 중첩 된 속성을 통해 만들어야합니다.레일 4 : 지정된 속성과 연결된 객체가 이미 존재할 때 상위 객체 생성을 금지합니다.

올바른 방법으로 도와주세요. 내 user.rb에 다음을 추가하려고 시도했습니다.

accepts_nested_attributes_for :social_profile#, :reject_if => proc {|attributes| Profile.where(:facebook_id=>attributes['facebook_id']).first} 

동일한 facebook_id를 사용하여 프로필 개체를 만들지 못하게합니다. 그러나 어쨌든 원하지 않는 프로필이 전혀없는 사용자 개체를 만듭니다. 이 경우 사용자 개체 생성을 어떻게 금지합니까?

답변

1

SocialMedia 모델의 데이터베이스 테이블에 고유 색인을 추가하기 만하면됩니다.

validates_uniqueness_of :facebook_id 

그리고 당신의 사용자 모델은 존재와 존재 여부를 테스트합니다 : : 또한 유효성 검사 추가 할 수 있습니다

validate_presence_of :social_media_id 
validate :social_profile_exists 

protected 

def social_profile_exists 
    errors.add(:social_media_id, "does not exist") unless SocialProfile.exists?(social_media_id) 
end 

또한 어쩌면이 이미 작동합니다 :

validates_associated :social_media 

것은 확인해야합니다 연관된 레코드 자체가 유효하다는 것을 나타냅니다.

+0

답장을 보내 주셔서 감사합니다. 어떤 경우에는 데이터베이스에 많은 사용자를 추가해야하며 유효성 검사가 중단됩니다. 그러나 나는 그 사용자가 조용히 건너 뛰어야 할 필요가있다. – Mitry

+0

음, 사용자 정의 검증 (기본적으로 social_profile_exists 메소드를 확장)을 작성할 필요가 없으면 건너 뛸 수 없습니다. 그러나 유효성 검사가 올바른 장소 일 수 있습니다. 정확하게 설정하는 방법은 정확한 사용 사례에 따라 다를 수 있습니다. 나는 당신이 당신의 질문에서 당신이 제공 한 정보에 대한 나의 대답에 기초를 두었고, 항상 미세 조정할 수 있습니다. –