2011-03-03 4 views
2

특정 시간 동안 데이터베이스에서 임의의 레코드를 표시하고 그 후에 다른 임의의 레코드로 새로 고침합니다.레일에서 몇 분마다 변수를 어떻게 변경합니까?

어떻게하면 레일을 통해 갈 수 있습니까?

지금 당장 나는 cronjobs의 방향을보고 있는데, 언제든지 보석을 ..하지만 나는 아주 간단한 행동 인 것처럼 모든 것을 정말로 필요로하지 않는다고 100 % 확신하지 못합니까?

답변

1

Rails.cache 메커니즘을 사용하십시오. 컨트롤러에서

: 첫 번째 실행시

@record = Rails.cache("cached_record", :expires_in => 5.minutes) do 
    Model.first(:offset =>rand(Model.count)) 
end 

는, 결과는 레일 캐시에 캐시됩니다. 5 분 후에 새로운 임의의 레코드가 검색됩니다.

1

내 모델에는 만료일이 있고 자바 스크립트 타이머가있는 사용자에게 표시됩니다. 시간이 경과 한 후, 나는 서버 (아마 아약스, 또는 어쩌면 페이지 새로 고침)에 다시 요청을 보내고 시간이 실제로 만료되었는지 확인합니다. 그렇다면 새로운 기록을 발표 할 것입니다.

0

당신은 단순히 컨트롤러에 현재 시간을 확인할 수 있습니다, 뭔가 같은 :

def show 
    @last_refresh ||= DateTime.now 
    @current ||= MyModel.get_random 
    @current = MyModel.get_random if (DateTime.now - @last_refresh) > 5.minutes 
end 

(가 데이터 저장을 위해 클래스 변수에 의존로) 코드의이 종류 이상의 서버로 확장되지 것, 너무 현실에서는 Redis (또는 Memcache even)와 같은 두 클래스 변수를 저장하지 않아도됩니다. 즉 고성능입니다. 얼마나 정확하게 이것을 필요로하고 얼마나 많은 성능이 필요한지에 달려 있습니다. 만료 시간을 저장하고 현재 시간 인 레코드를로드하려면 일반 데이터베이스를 사용할 수도 있습니다.

+0

이 예에서는 서버가 검사하지 않는다는 작은 통지 만 있습니다. 보안에 관심이있는 경우 모델 속성과 같은 값이 저장된 서버와 비교하여 보안을 확인해야합니다. – Spyros

0

처음에는 전역에 레코드를 캐시하는 것이었지만 다른 서버에서 제공하는 다른 레코드로 끝낼 수있었습니다. 레코드에 a : selected_at datetime 열을 추가하는 방법 ...

class Model < AR::Base 

    def self.random 
    @@random = first(:conditions => 'chosen_at NOT NULL') 
    return @@random unless @@random.nil? or @@random.chosen_at < 5.minutes.ago 
    @@random.update_attribute(:chosen_at,nil) if @@random 
    ids = connection.select_all("SELECT id FROM things") 
    @@random = find(ids[rand(ids.length)]["id"].to_i) 
    end 

end 
관련 문제