2010-03-26 5 views
0

데이터베이스에 Ruby 객체의 직렬화 된 계층 구조를 저장해야하는 문제에 대해 작업하고 있습니다. 저장할 필요가있는 많은 객체는 많은 속성을 가진 ActiveRecord 객체입니다. 전체 개체를 저장 한 다음로드했을 때 DB에서 해당 특성을 새로 고치는 대신 (변경된 경우 가능성이 있음) 이러한 개체에 대한 참조 (클래스 및 데이터베이스 ID)를 저장하는 것이 더 쉬울 것입니다.속성을 저장하지 않고 ActiveRecord 객체를 직렬화 하시겠습니까?

이미 레일스에서이 작업을 수행 할 수있는 방법이 있는지 또는 기존 보석이 있는지 알고있는 사람이 있습니까? 해킹을하기 전에 뭔가 존재하는지 확인하고 싶었습니다.

답변

2

귀하의 문제를 이해하는 한, acts_as_nested_setbetter_nested_seteven_better_nested_setawesome_nested_set에 대해 알아야합니다. 나는 그들이 직렬화 된 계층 구조를 저장하지 않지만 자신의 노드를 원자 적으로 저장해야한다는 것을 알고있다. 거대한 트래픽 사이트조차도 그렇게합니다. 그 외에도 NoSQL (또는 스키마가없는 DB)을 고려해야합니다.

1

당신의 문제를 이해한다면 :serialize field_name 모델을 추가하고 모든 속성 중첩 된 객체를이 필드에 푸시해야합니다. Rails는 gem Marshal을 사용하여이 객체를 직렬화합니다.

Marshal을 사용하여 레일 및 ActiveRecord없이 일련 번호를 지정하는 예가 있습니다. 및 this - 스택 오버플로에 대한 대답은 어떻게 작동합니까?

+0

이것은 현재 작동하고 있으며 현재 객체의 모든 속성을 저장합니다. 그런 다음 deserialize 후 ActiveRecord 객체를 DB에서 변경했을 수 있으므로 ActiveRecord 객체를 다시로드해야하므로 많은 공간이 낭비되어 버려진 특성을 마샬링합니다 (최신 특성으로 대체 됨). 해킹하고 싶습니다 : serialize/Marshal 이렇게하면 activerecord 객체의 id를 저장하고 DB에서 다시로드합니다. –

+1

루비 클래스에 marshal_load 및 marshal_dump 메소드를 구현해야합니다. 직렬화 할 속성과로드 할 속성을 선택하여 선택할 수 있습니다. 자세한 내용은'potapuff'에 의해 링크 된 답변을 참조하십시오. (+1) –

+0

나는 직렬화가 YAML을 사용한다고 생각한다. 직렬화되는 것을 정확하게 제어하려면 AR :: Base를 확장하지 않는 클래스를 도입하고 to_yaml_properties를 구현하십시오. 그런 다음이 클래스의 인스턴스를 AR 객체에 직렬화하면됩니다. – Levi

관련 문제