2011-04-23 5 views
0

으로 만들 사용 방법 :레일 - 찾거나 다음 나는 현재이 기본값

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id) 

이 올바르게 레코드를 작성, 문제는 conversation.read의 기본 값이 false입니다.

이 특정 방법에서는 레코드를 만들 때 기본값을 true로 설정하려고합니다. 지금 내가 작동하게하는 유일한 방법은 다음과 같습니다.

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id(conversation.id) 
    conversation_participation.read = true 
    conversation_participation.save 

문제는 DB에 두 번 도달하는 것입니다. find_or_create를 사용하고 기본값을 설정하려면 어떻게합니까 : read => true?

감사

답변

1

당신은

find_or_initialize_by... 그런 다음 정상

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id) 
conversation_participation.read = true 
conversation_participation.save 

또는

read 속성을 설정하려고 할 수 있습니다 after_initialize
conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id_and_read(conversation.id, true) 
conversation_participation.save 

는 (아 .. 당신은 당신의 코멘트를 삭제하지만, 여기에 단지의 경우에 그것에 대해 뭔가)

class Conversation < ActiveRecord::base 
    def after_initialize 
    self.read ||= true # true if not already set 
    end 
end 

그럼 당신은 find_or_create|initialize_by...을 수행 할 수 있습니다 또는 어느 이제까지 방법을 계속 진행하고 싶습니다.

자세한 내용은 callbacks을 참조하십시오. here에서

+0

거기에 기본값을 설정하려면 'after_initialize'를 살펴볼 수 있습니다. – nowk

0

이 시도 :

conversation_participation = @user.conversation_participations.find_or_create_by_conversation_id_and_read(conversation.id, true) 
+0

대기 중입니다. conversation_participation이 거짓 읽기 (매우 유효한 경우)로 인해 새 레코드가 생성됩니다. 아니요. – AnApprentice

+0

당신 말이 맞아요, 이것에 대해 알지 못했습니다. – edthix

1

:

사용하려면 먼저 저장하지 않고 새로운 기록을 반환 할 경우 find_or_initialize_by_ 찾기.

그래서 이런 일이 그냥 대신 UPDATE 다음에 INSERTINSERT을해야

conversation_participation = @user.conversation_participations.find_or_initialize_by_conversation_id(conversation.id) 
conversation_participation.read = true 
conversation_participation.save 

.

관련 문제