2014-12-23 2 views
1

나는 "Value"라는 float 속성을 가진 "User"모델을 가지고 있습니다. 사용자 제작 후 24 시간마다 각 사용자의 가치를 1 % (예 : 0.99 배) 감가 상각하고 싶습니다. 예를 들어 사용자가 1 월 1 일 02:34에 값 5로 생성 된 다음 1 월 2 일 2시 34 분에 값이 4.95로 재 계산되어야합니다. 그런 다음 1 월 3 일 02시 34 분에 4.9005로 다시 계산해야합니다.주어진 시간 간격 후에 속성을 주기적으로 다시 계산할 수 있습니까?

이 작업을 수행 할 수 있습니까?

레일즈 4.0.10 앱을 사용하고 있습니다. 이 같은 일을 할 수있는 delayed_job 보석으로

+0

지연된 작업 사용을 고려하십시오. https://github.com/collectiveidea/delayed_job – shivam

+1

값이 정확히 24 시간 후에 얼마나 중요한지, 나중에 한 시간이 지나면 문제가 있습니까? 데이터베이스에 저장된 업데이트 된 값이 필요합니까, 아니면 누군가가 값을 읽었을 때 값이 계산되면 충분합니까? – spickermann

+0

@spickermann 저는 모든 사용자가 동일한 일정 비율로 감가 상각하기를 바랍니다. 따라서 모든 사용자에게 동일하거나 거의 동일한 간격을 유지하는 한 실제로는 문제가되지 않는 하루 이상 또는 하루 미만이 걸릴 수 있습니다. 예, 업데이트 된 값은 데이터베이스에 저장되어야합니다. –

답변

0

:

# in user.rb 
after_create :decrease_value_periodically 

private 
def decrease_value_periodically 
    self.value = value * 0.99 
    self.save! 

    decrease_value_periodically if value > 0 
end 
handle_asynchronously :decrease_value_periodically, 
         :run_at => Proc.new { 24.hours.from_now } 

이 예제는 사용자의 생성 후 24 시간 실행됩니다 또 다시 자체를 통해 일정을 조정하고있다.


다른 옵션은 모든 사용자의 값을 동시에 (예 : 자정) 다시 계산하는 일일 크론 작업 일 수 있습니다.

# command for Cron 
rails runner "User.recalculate_all_values" 

# in user.rb 
def self.recalculate_all_values 
    User.all.each { |user| user.decrease_value } 
end 

private 
def decrease_value 
    if value > 0 
    self.value = value * 0.99 
    self.save! 
    end 
end 

는 IMO가 우선 순위에 따라 다릅니다 : 24 시간 후 정확한 실행을 원하는 경우에, delayed_jobs을 선택하면 설정이 같은 레일 방법을 실행하는 크론 작업을 할 수있다. Cron 솔루션은 유지하기가 쉽지만 초기 또는 늦게 값을 줄이는 결과가 발생할 수 있습니다 (사용자가 오후 11시와 1 시간 후에 생성 된 후 Cron 작업이 값을 처음으로 제거하는 경우).

+0

지연된 작업은 작업을 예약하는 것이지, 정기 작업 (예 : 매시간, 매일 또는 매월)을 실행하는 것이 아닙니다. 이 경우 지연된 직업은 매우 나쁜 제안이 될 것입니다. – Surya

+0

ElGuapo가 필요로하는 것은 정기적 인 작업이 아니라 (매일 고정 된 시간에) 지연된 작업이 좋은 해결책이라고 생각합니다. 그는 예정된 작업이 필요합니다 (각 개별 사용자 생성 후 24 시간). 그리고 그것은 delayed_jobs가 제공하는 것입니다. – spickermann

+0

사실 OP는 2 월 1 일 (사용자 생성 후 날)에 값이 1 % (4.95), 3 번째로 1 % (4.9005) 등으로 줄여야한다고 제안합니다. 이 솔루션은 다음 날에 하나의 작업 일정을 정하며, 매일 일정을 계획하지 않습니다. – Surya

관련 문제