2008-10-02 13 views
3

하나의 ActiveRecord 모델에서 serialize을 사용하여 간단한 해시 Array을 텍스트 데이터베이스 필드로 직렬화합니다. 심지어는 두 번째 매개 변수를 사용하여 역 직렬화를 Array으로 강제 변환합니다.ActiveRecord의 serialize가 데이터를 무작위로 왜곡합니까?

class Shop < ActiveRecord::Base 
    serialize : recipients, Array 
end 

잘 작동하는 것 같다하지만, 몇 가지 요청 후, recipients의 내용 HashOfIndifferentAccess 해시 대신 배열로 변합니다. 이것은 모델을 몇 번 다시로드 한 후에 만 ​​발생하며 프로덕션 환경에서만 테스트 또는 콘솔에서 재현 할 수 없었습니다.

+1

루비와 AR의 어떤 버전 –

+0

데이터베이스의받는 사람 속성이 어떤 데이터 유형입니까? – Tilo

+0

나는 완전히 이해하지 못한다. 예상했던 해시로 채워진'HashWithIndifferentAccess' 또는'HashesWithIndifferentAccess'로 채워진'Array'를 되찾았습니까? 직렬화 유형 불일치 오류가 발생했거나 사용자 정의 코드에서 문제가 발생 했습니까? 던져진 예외가있는 경우 스택 추적 및 오류 메시지 등을 포함하는 것이 매우 유용합니다. –

답변

1

이것은 충분한 테스트를 통해 로컬에서 재현 할 수 있어야하는 것처럼 보입니다. 프로덕션 db와 로그를 조사하고 로컬 테스트에서 동일한 데이터를 사용하려고 시도하십시오.

hashwithindifferent 액세스가 컨트롤러에서 나옵니다. 컨트롤러에서 데이터를 직접 가져 와서 전혀 마사지하지 않는 것일 수도 있습니다.

페이지, 컨트롤러 및 모델 저장 코드의 요지를 만들고이 질문을 업데이트하십시오. 해시 중첩 정도에 따라 저장하기 전에 HWIA 해시를 일반 해시로 변환 할 수 있습니다.

디버깅 및 해결하기가 너무 어렵지 않아야합니다.

2

레일즈 3.1 앱 중 일부 직렬화 된 필드에 동일한 문제가있었습니다. 많은 문제 해결 후에 문자 인코딩 문제로 좁혔습니다. 내 프로덕션 환경이 Postgres에있는 동안 SQLite를 사용했기 때문에 로컬로 재현 할 수 없었습니다.

일련 화되기 전에 모든 값에 some_field.force_encoding(Encoding::UTF_8)을 적용 해보고 무슨 일이 일어나는 지보십시오.