2011-10-20 3 views
4

나는 이름과 설정이있는 간단한 사용자 모델을 가지고 있습니다. 사용자 AREL을 저장할 때마다 설정 열을 업데이트합니다. 예 :루비 온 레일즈는 매 시간마다 일련 화 된 속성을 업데이트합니다.

user = User.find_by_name('kevin') 
user.save 

(0.3ms) UPDATE "users" SET "updated_at" = '2011-10-20 19:58:06.363541', "settings" = '--- {}' WHERE "users"."id" = 1 

save를 호출 할 때 다른 필드가 업데이트되지 않습니다. 이 예상되는 동작입니까? 업데이트를 수행하는 이유는 무엇입니까? 직렬화 된 내용이 변경되지 않은 경우 변경되지 않도록 해제 할 수 있습니까? 이것은 예상되는 동작

http://cl.ly/0p0j3Z3Y0L1x1I1p3Z0g

+0

당신이 위의 첫 번째 행 다음에 즉시 호출하면'user.changes'의 출력은 무엇인가 :

는 다음 (루비 1.8.7) IRB 세션을 고려? 속성에 대한 클래스를 지정하면 어떻게됩니까? 예 : 'serialize : settings, Hash'? –

+0

@Hordan이 '해시'를 지정하면 도움이되지 않습니다. 'User.changes'는 빈 해시를 반환합니다. –

답변

8

: 나는 최소한의 케이스를 만드는 데 사용되는 샘플 프로젝트를 업로드했습니다. 직렬화 된 속성 내에서 변경 사항을 감지하는 것은 매우 어렵 기 때문에 모든 저장시 업데이트됩니다.

ruby-1.8.7-p352 :001 > x = "--- \n:b: 2\n:a: 1\n" 
=> "--- \n:b: 2\n:a: 1\n" 
ruby-1.8.7-p352 :002 > y = "--- \n:a: 1\n:b: 2\n" 
=> "--- \n:a: 1\n:b: 2\n" 
ruby-1.8.7-p352 :003 > x == y 
=> false 
ruby-1.8.7-p352 :004 > YAML.load(x) == YAML.load(y) 
=> true 
+0

왜? serialize 된 후 u.settings_was와 u.settings의 문자열 비교를 할 수 없습니까? –

+0

.. 답변을 업데이트했습니다. 또한 Dirty 모듈은 속성 변경시 ActiveRecord가 특정 메소드를 호출하여 변경 사항에 대한 알림을 받을 것으로 기대합니다. 예를 들어, 해시 값을 변경하는 프로세스를 구현하는 것은 매우 어렵습니다. – moritz

관련 문제