2010-01-31 4 views
0

주어진 필드에 대해 validation_uniqueness_of에 실패하면 객체를 저장하지만 객체를 반환하는 방법이 있습니까?유효성 검사 실패 후 객체 반환

class User 
    has_many :words 
... 
end 

class Word 
    belongs_to :user 
    validates_uniqueness_of :title 
... 
end 

을 그리고 나는 사용자가 이미이 단어를 저장 한 경우 Word 개체를 반환하거나 새로 저장된 단어 개체를 반환하거나 원하는 상황을 예를 들어, 나는 다음 있습니다. 나는 단어 객체 내 자신의 검색을 통해 존재하는지 확인하는 자신을 발견하고하지 않을 경우, 슈팅을 막아 수행하고있다 : 사용자가 저장 한 단어가없는 경우처럼, 레일 중복을 수행 할 것입니다

existing_word = find_by_word_and_user_id(word, user) 
!existing_word.nil? ? existing_word : user.words.create({:word => word}) 

하지만 느낌 내 검사 후 제목 고유성 유효성 검사를 수행하고 저장을 수행하고 레일스가 유효성 검사를 위해 찾은 기존 개체를 반환 할 수 있는지 궁금합니다.

답변

1

, 액티브의 마술 방법의 또 다른 :

obj = Word.find_or_create_by_word_and_user(word, user) 

# Preferred way 
obj = user.words.find_or_create_by_word(word) 

이 어쨌든이 개 데이터베이스 요청을 할 것입니다 : 그 주위에 방법이 없습니다. 또한 Word 인스턴스에 표시 한 유효성 검사가 더 많으면 #find_or_create_by가 더 많은 특성을 전달할 수 없기 때문에 create가 실패합니다.

동적 찾기 메소드에 대한 자세한 내용은 http://api.rubyonrails.org/classes/ActiveRecord/Base.html에서 "동적 속성 기반 검색 프로그램"을 검색하십시오.

1

당신은 작은 단지 말함으로써 그 진술을 건조 할 수 있습니다 : 당신이 그것을 찾기 위해 노력 전에 을 만들려고 할 경우,이 반전하여 DB의 히트를 제거 할 수

find_by_word_and_user(word, user) || user.words.create(:word => word) 

. 그러나 생성이 실패 할 수있는 다른 이유가 있기 때문에 이는 좋은 생각이 아니므로 고유성 문제라는 것을 보장 할 수 없습니다.

첫 번째 방법으로 눈에 띄는 성능이 저하되는 것을 보지 못할 것입니다. 유일한 다른 옵션은 유효성 검사 자체를 제거하고 위의 문을 사용하는 것입니다. 그러나 그때 당신은 어디에서나 단어를 만들고, 유일성을 확인해야합니다. 당신은 #find_or_create_by_word_and_user에 관심이있을 수

관련 문제