0

내 사용자 모델에서 serialize하도록 설정된 안내 필드가 있습니다. 기본적으로 필드는 전무이지만 나중에 이런 식으로 끝낼 수 있도록 계획은 다음과 같습니다 [: 사용자] [: guided_step3] 내가 서버의 param에 게시 할 경우serialize 필드를 사용하여 모든 것을 대체하고 업데이트를 관리하는 방법은 무엇입니까?

{ 
guided_step1 : true, 
guided_step1_decision : 33, 
guided_step2 : true, 
guided_step3 : false, 
guided_step4 : false 
} 

내 질문이있다 = 사실 , 그것은 모든 것을 삭제하는 것을 끝낸다. 필드를 게시하고 업데이트하거나 삽입하려면 어떻게해야합니까? 이 유스 케이스를 처리하는 올바른 방법은 무엇입니까? 감사합니다.

답변

1

여기서 두 가지 접근법을 볼 수 있습니다. 간단한 그냥 update_attributes로 전송하는 대신 컨트롤러의 해시를 병합하는 것입니다

guided_steps = params[:user].delete(:guided_steps) || {} 
@user.guided_steps = (@user.guided_steps || {}).merge(guided_steps) 
@user.update_attributes(params[:user]) 

또 다른, 당신이 정말로 그것을 자동으로 싶은 경우에, 당신의 User 모델 guided_steps에 대한 작가 방법을 재정의하는 것입니다

class User < ActiveRecord::Base 
    ... 
    def guided_steps=(new_steps) 
    gs = self.guided_steps || {} 
    gs = gs.merge(new_steps || {}) 
    write_attribute(:guided_steps, gs) 
    end 
    ... 
end 

이렇게하면 컨트롤러에 @user.update_attributes(params[:user])을 호출 할 때 새로운 guided_steps이 이전 컨트롤러와 병합됩니다. 이 접근법에 대한 잠재적 인 단점은 guided_steps=이 이전보다 약간 덜 직관적으로 작동한다는 것입니다. 예를 들어 @user.guided_steps = {}은 해시를 지우지 않습니다. 따라서이 접근 방식의 장단점을 균형 잡는 것은 사용자의 몫입니다.

1

왜 작동하지 않습니까?

user = User.find id 

user.datastpeps[:guided_step3] = true 
user.save 
+0

잘 작동하지만 모든 것을 하드 코딩해야합니다. 나는 jQuery 아약스 포스트를 사용하여 params를 게시하고 레일즈에 업데이트를 만드는 마법을 걸어야한다. – AnApprentice

+0

jquery가 새로운 쌍뿐만 아니라 전체 해시를 보내는 유일한 방법은 당신이 그것에 의존해야한다는 것이다. 예를 들어 동일한 사용자가 동일한 순간에 2 번 그렇게하면 무언가가 손실되고 데이터가 일치하지 않게됩니다. –

관련 문제