2010-02-20 2 views
9

몇 가지 ActiveRecord 모델에 맞는 체크 아웃 프로세스가있는 Rails 기반 이벤트 등록 응용 프로그램을 리팩토링하고 있습니다. 이상적으로, 체크 아웃이 완료되지 않으면 (지불이 성공적으로 처리 된 경우) 오브젝트가 저장되어서는 안됩니다. 나는이 객체들을 세션에 일시적으로 직렬화하는 것이 왜 나쁜 것인지를 확신 할 수는 없지만, 그 나쁜 mojo를 반복해서 읽었습니다. 적어도 기존 레코드가 없으므로 기존 레코드와 동기화되지 않을 위험이 없습니다.세션에 없으면 ActiveRecord 객체를 임시로 저장하는 방법과 위치는 어디입니까?

내 질문은 :

A) 그들이 다른 곳에 존재하지 않더라도 여전히 세션에서 기록을 저장에 문제가 있습니까? 모델을 수정하더라도 모든 기존 세션을 종료 할 수 있습니까?

B) 문제가 발생할 수있는 경우 개체를 임시로 저장해야합니까? 부울 플래그를 저장해야 영구적 대 임시 상태를 나타낼 수 있습니까? 그런 다음 오래된 개체를 제거하기위한 스크립트를 작성 하시겠습니까?

생각하십니까?

답변

5

왜 데이터베이스에 저장하지 않더라도 "불완전"하다는 것을 알고 있습니까?

예를 들어 added_to_cart_at datetime 필드를 추가 할 수 있습니다. 제품이 장바구니에 추가되면 레코드를 저장하고 해당 필드의 값을 설정합니다. 그런 다음 사용자가 구매를 완료하면 필드를 지우고 제품을 주문과 연관시킵니다.

부실 레코드를 지우려면 added_to_cart_at이 1.day.ago보다 오래된 모든 레코드를 삭제하도록 매일 cron을 설정할 수 있습니다.

+0

나는 이것이 갈 길이라고 생각한다. 개념적으로, 모델을 사용하는 것이 나에게 의미가 있습니다. 일시적이지만 아직 유효하지 않은 데이터가 데이터베이스에 없어야합니다. 맞습니까? 실용적인 문제로서, 나는 이것이 의미가 없으며 이러한 유형의 해결책이 더 강력 할 것이라는 것을 알 수 있습니다. 귀하의 의견을 보내 주셔서 감사합니다. – tacomachine

1

세션에 저장하는 문제는 세션의 공간이 제한된다는 것입니다. ActiveRecord 객체는 세션에 저장할 때 공간 측면에서 많은 오버 헤드를 가져옵니다. 밀도가 높은 has_many 관계로 레코드를 저장하는 경우 문제가 발생합니다.

저는 Simone Carletti가 데이터베이스의 부분 레코드를 저장하는 것이 최상의 솔루션이라고 생각합니다.

그러나 실제로 세션에 개체를 저장하려는 경우 가능한 최소한의 정보를 저장하십시오. 예를 들어 ID 및 업데이트 된 필드 만 해당됩니다. 또한 개체를 세션에 직접 저장하는 대신 해시로 저장하십시오.

+0

예, 세션을 사용해야하는 경우 이것이 방법이라고 생각합니다. 내가 또한 고려한 것은 부분 레코드를 데이터베이스에 저장하는 것이지만 부분 레코드의 ID에 각각의 user_id를 관련시키는 해시를 사용하여 세션을 통해 사용자에게 연결하는 것입니다. 나는 이것이 효과가있을 것이라고 믿지만 세션에 불필요하게 의존하고있다. Simone의 솔루션은 똑같은 일을해야하지만 더 좋습니다. – tacomachine

관련 문제