2016-10-06 2 views
1

사이의 값을 보존 webscript. 문제는 처음 작동하지만 그 스크립트를 사용하는 페이지를 새로 고침 할 때마다 값을 유지한다는 것입니다. (Rails + activeadmin)루비 내가 루비이 큰 문제가 호출

ActiveAdmin.register Order, as: 'FinanceOrders' do 
    idx = 0 

    index do |x| 
    column :id do 
     idx += 1 
    end 
    column :contractor do |order| 
     amount = order.contractor_payment_amount 
     Finances.add amount 
     amount.to_money 
    end 

    summary = Finances.get_summary collection 

    tfoot do 
     tr do 
      column :contractor do |order| 
       Finances.total.to_money 
      end 
      column :profit do |order| 
       (order.sum_cost/100).to_money * (1 - FEE) - Finances.total.to_money 
      end 
      end 
     end 
     td 
     end 
    end 

    end 

end 

나는 레일스에서 ​​어떤 종류의 캐싱이라고 생각합니다. 질문은, 캐싱이 있기 때문에, 내가 원하는 것을 어떻게 성취 할 수 있습니까? (idx, ids + = 1도 작동하지 않습니다. 처음에는 문제가 없지만 모든 페이지를 새로 고칠 때마다 idx 값이 누적 됨)

답변

0

실제로 실행 시간에 실행 된 코드가 아니라 모듈/클래스 정의에서 카운터와 누적기를 초기화하고있었습니다.

용액이되었다 :

index do |x| 
    Finances.start 
    idx = 0 

@@sum를 초기화한다 Finances.start 방법을 생성하고 색인 통화가 idx 카운터와 함께 블럭을 이동하므로 이들 값은 실제로 모든 인덱스에 초기화있어 코드 실행.

그것은 매력처럼 작동합니다.

+0

여전히 동시성 문제가 있습니다. 5 대의 서버로 유니콘을 시작하고 여러 명의 요청자를 사용하면 내 뜻을 알 수 있습니다. 현재 모든 요청이 일련 번호로 처리됩니다. 다중 프로세스 또는 다중 처리 된 서버 및 과부하를 사용할 때만 의미하는 것을 볼 수 있습니다. – slowjack2k

+0

이것이 받아 들여지는 대답 일 의도가 있습니까? 그렇다면 시스템 시간이 초과 될 때까지 기다렸다가 선택하십시오. 그럴 수 없다면 상태 정보를 답으로 추가하지 마십시오. 답안에 "감사"하는 것이 바람직하지 않습니다. SO는 온라인 참고서이므로 토론 포럼 인 것처럼 작성하지 않습니다. 친숙 함과 친숙 함은 괜찮지 만 여전히 그 점을 지키십시오. –

2

먼저 개발 모드에서 모든 클래스와 모듈이 언로드되고 포함 된 파일이 변경되면로드되고 클래스 변수는 레일스가 클래스를 다시로드 할 때마다 0으로 재설정됩니다.

더 자세히 알려면 웹 서버에 따라 스레드 또는 다중 프로세스 환경에서 작업하고 있다는 것을 명심해야합니다. 어쩌면 멀티 호스트 환경에서 작업하기 때문에 여러 스레드 또는 프로세스간에 상태를 공유해야합니다.

클래스 변수 또는 클래스 인스턴스 변수는 다중 처리 환경 (경쟁 조건을 무시한 경우)에서이를 달성 할 수 있지만 다중 프로세스 또는 다중 호스트 환경에서는 작동하지 않습니다.

레일즈를 사용하면 요청간에 여러 가지 방법으로 상태를 공유 할 수 있습니다 (예 : session, 데이터베이스, 파일 시스템 등).