복붙노트

[RUBY-ON-RAILS] 레일의 세션에 객체 저장

RUBY-ON-RAILS

레일의 세션에 객체 저장

나는 항상 세션에 객체를 저장하는 나쁜 생각이라고 배워왔다. 대신 ID는 필요할 때 레코드를 검색하는 저장해야합니다.

그러나, 나는 내가 궁금해이 규칙에 대한 예외임을 응용 프로그램이 있습니다. 나는 플래시 카드 응용 프로그램을 짓고 있어요, 그리고 quizzed되는 단어는 스키마가 변경되지 않는 데이터베이스의 테이블에 있습니다. 나는 그들이 별도의 페이지로 이동할 경우 시작 위치를 사용자가 완료 할 수 있도록, 현재 세션에서 quizzed되는 단어를 저장할.

이 경우, 데이터베이스 객체로이 단어를 저장 멀리 얻을 수 있습니다? 그렇다면, 왜? 퀴즈를 신속하게 이동하도록 설계되어, 나는 결코 처음부터 변하지 않는 기록을 검색의 데이터베이스 호출을 낭비 싫어하기 때문에 물어 이유입니다. 그러나, 아마도 내가 알고 아니에요 큰 세션에 다른 악재가있다.

* 기록을 위해, 나는 레일 2.3에 내장 된 Memcache의 방법으로 캐싱을 시도했지만 분명히 1메가바이트의 항목 당 최대 크기가 그했다.

해결법

  1. ==============================

    1.세션에 저장 개체에 대한 주된 이유없는 오브젝트 구조 변경하는 경우, 당신은 예외를 얻을 것입니다. 다음을 고려하세요:

    세션에 저장 개체에 대한 주된 이유없는 오브젝트 구조 변경하는 경우, 당신은 예외를 얻을 것입니다. 다음을 고려하세요:

    class Foo
      attr_accessor :bar
    end
    
    class Bar
    end
    
    foo = Foo.new
    foo.bar = Bar.new
    put_in_session(foo)
    

    그런 다음, 프로젝트의 후속 릴리스에서, 당신은 바의 이름을 변경합니다. 당신은 서버를 재부팅 한 세션에서 잡아 foo는 시도. 이 역 직렬화하려고하면, 그것은 바 및 폭발을 찾기 위해 실패합니다.

    이이 함정을 피하기 쉬운 것처럼 보일 수 있지만 실제로, 나는 그것이 사람들의 수를 물어 보았다. 이는 객체를 직렬화하는 (이런 종류의 투명 있어야하는데) 즉시 명백한 것보다 때로는 함께 더 걸릴 수 있으며, 이에 대해 엄격한 규칙을 가지고하지 않는 한, 일 최대 어리둥절 얻을하는 경향해서입니다.

    그것은 일반적으로 눈살을 찌푸리게있어 그 이유는이 액티브에서 사람을 무는 것은 시간이 지남에 따라 변화하는 앱 구조에 대한 매우 일반적이기 때문에 그것은 매우 흔한 일이다, 그리고 세션은 더 이상 그들이 원래 생성 된 후 일주일 직렬화 또는 할 수있다.

    모든 것을 이해하고 있는지 모델이 변경되지 않고 아무것도 추가를 직렬화되지 않도록 할 에너지에 넣어하고자하는 경우, 당신은 아마 괜찮아요. 하지만 조심해야 해 :)

  2. ==============================

    2.레일은 편안하고 디자인을 장려하는 경향이 있고, 세션을 사용하는 것은 매우 편안하고하지 않습니다. 아마 단어의 무리뿐만 아니라 current_word가있는 퀴즈 자원을 만들 것입니다. 그들이 돌아올 때 그들이 어디 이런 식으로, 당신은 알 수 있습니다.

    레일은 편안하고 디자인을 장려하는 경향이 있고, 세션을 사용하는 것은 매우 편안하고하지 않습니다. 아마 단어의 무리뿐만 아니라 current_word가있는 퀴즈 자원을 만들 것입니다. 그들이 돌아올 때 그들이 어디 이런 식으로, 당신은 알 수 있습니다.

    이제, REST는 (당신이 말하는 사람에 따라) 모든 아니라 많은 세션에 대한 꽤 좋은 케이스가있다. 세션과 디스크에서 일을 작성하고있는 거 쓰기, 더 이상 그것을 다시 읽어하는 데 걸리는 당신이하는 더 많은 데이터를 기억 ...

  3. ==============================

    3.앱이 레일 응용 프로그램이기 때문에, 나도 제안 :

    앱이 레일 응용 프로그램이기 때문에, 나도 제안 :

  4. ==============================

    4.당신의 CookieStore (내가 믿는 2+ 레일의 기본)를 사용하는 경우 직접 세션 개체를 저장 접하게 훨씬 더 교활한 문제입니다. 그것은 복구하기가 매우 어려운 CookieOverflow 오류를 얻을 매우 쉽습니다.

    당신의 CookieStore (내가 믿는 2+ 레일의 기본)를 사용하는 경우 직접 세션 개체를 저장 접하게 훨씬 더 교활한 문제입니다. 그것은 복구하기가 매우 어려운 CookieOverflow 오류를 얻을 매우 쉽습니다.

  5. from https://stackoverflow.com/questions/1095714/storing-objects-in-a-session-in-rails by cc-by-sa and MIT license