2013-03-20 5 views
3

모델이있는 경우에만 모델의 값을 업데이트하려고합니다. 그렇지 않으면 아무것도하지 않습니다. 검색은 업데이트를 반환하거나 질문/답변을 만드는 것처럼 보이지만 나는 만들고 싶지 않습니다.업데이트가 있으면 업데이트하고, 그렇지 않으면 아무것도하지 않으시겠습니까?

은 내가 간단한와 함께 할 수있어 : 임시 지역의 값을 할당하거나 경우를하지 않고, 하나의 호출에서이 작업을 수행 할 수있는 방법이 같은

found = Model.find_by_id(id) 
if found 
    update stuff 
end 

그러나, 나는 생각합니다.

존재하지 않는 경우 시끄러운 오류없이 레코드를 업데이트하려면 어떻게해야합니까?

최신 레일 3.x를

+2

모델이 존재하는지 여부를 말할 때 앱이 모델을 정의하는지 또는 데이터베이스의 특정 데이터 특정 데이터를 이미 갖고 있는지 여부를 결정 하시겠습니까? –

+0

db에 특정 데이터가 이미있는 경우 –

+0

예 : 고객이 도움말 페이지를 방문한 경우 customer_help_visits에 대한 기록이 있습니다. 고객이 * main * 페이지를 방문하면 customer_help_visits가 last_browsed로 업데이트됩니다. 모든 고객이 customer_help_visits를 사용하는 것은 아닙니다. 이것은 실제 구조가 아닙니다.이 아키텍처가 얼마나 어리석은지를 깨달았습니다. 실제 코드에 대해 구체적으로 말하지 않고 예제로 생각할 수 있습니다.] –

답변

8

당신은 find_by_id 또는 where의 결과에 update_attributes를 호출하기 전에 레일의 try 방법을 사용할 수 있습니다.

try은 레코드가 존재하지 않으면 예외를 발생시키지 않고 자동으로 nil을 반환합니다. 레코드가 있으면 레코드를 업데이트합니다. 레일 4에서

found = Model.find_by_id(id).try(:update_attributes, {key: value}) 
0

이 모델이 '이벤트'라고 가정하고 당신이 ID로 검색, 당신은 할 수 :

e = Event.where(:id => id) 
if !e.empty? 
    e.first.value = new_value 
    e.first.save! 
end 
+0

미안하지만 분명히해야합니다. update_attributes_if_exists 레일 명령입니다. –

1

님의 first_or_initialize new_record과 함께 사용할 수 있습니까? 다음과 같이

client = Client.where(first_name: 'Nick').first_or_initialize(locked: false) 
client.save unless client.new_record? 
+1

존재하지 않으면 * 만들지 않습니다 *. –

+0

정확히 new_record가 아닌 경우는 무엇입니까? – sailor

0

이 아마 가장 간단한 내가 찾은 솔루션입니다 : FBID와 사용자가 다음 레코드가 업데이트됩니다있는 경우

# POST /users 
# POST /users.json 
def create 
    @user = User.find_or_initialize_by(fbid: user_params[:fbid]) 
    @user.assign_attributes(user_params) 
    respond_to do |format| 
    if @user.save 
     format.html { redirect_to @user, notice: 'User was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @user } 
    else 
     format.html { render action: 'new' } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
    end 
    end 
end 

; 그렇지 않으면 새로운 것이 생성됩니다. 고유하게 유지하고자하는 열과 일치하도록 레코드를 갱신 할 수 있습니다. 아마도 열을 인덱싱하면 검색에 도움이됩니다 & 검색 등

희망이 도움이됩니다!

관련 문제