2012-08-02 29 views
5

Bir tarih eşit şuna benzer: 2012-07-23Raylar tarih karşılaştırması; Tarih büyük veya benim veritabanında gün önce

Ben tarih büyükse tarihi less than 14 gün önce daha eski 7 gün önce ve olmadığını görmek veya görmek için çalışıyorum

def progress_report_status_check(date) 
    progress_date = date.to_date 
    seven_days = 7.days.ago.to_date 
    fourteen_days = 14.days.ago.to_date 

    if seven_days > (progress_date - 7.days.ago.to_date) or (progress_date - 14.days.ago.to_date) < fourteen_days 
     "due" 
    elsif (progress_date - 14.days.ago.to_date) > fourteen_days 
     "overdue" 
    end 
    end 
+1

Rails kullanıyor musunuz? Ruby'nin gün yöntemi yok. Bu – revolver

+0

için ActiveSupport'a ihtiyacınız var, üzgünüm, bunu eklemeyi unuttum .. Rails kullanıyorum 3 – dennismonsewicz

cevap

5
def progress_report_status_check(progress_date) # Pass in a date 
    if (progress_date < Date.now-14.days) 
    "overdue" 
    elsif (progress_date < Date.now-7.days) 
    "due" 
    end 
end 

veya (daha az okunabilir)

: 14 günden önce, ancak hiçbir şans yaşıyorum .. Burada

benim kodudur
def progress_report_status_check(progress_date) # Pass in a date 
    (progress_date < Date.now-14.days) ? "overdue" : ((progress_date < Date.now-7.days) ? "due" : "") : "" 
    end 
end 

Eğer adlandırılmış kapsamları oluşturmak istediğiniz Kullanımınıza olabilir bağlı ki: Kabul yanıt Tarihinde tanımsız bir yöntem kullanır şey

def progress_report_status_check(progress_date) # Pass in a date 
    self.overdue? ? "overdue" : self.due? ? : "due" : "" 
    end 
end 
+0

'Time.now.to_date' kullanmak zorunda kaldım ... tarihte undefined yöntemini kullanmaya devam ediyorum .. ama bu bir cazibe gibi çalışıyor! – dennismonsewicz

+1

Elbette. Tarih, raylara otomatik olarak dahil edildiği için biraz garip (yani konsol konsolunda görüyorsunuz) fakat Ruby'de değil, dolayısıyla IRB isteminde kullanamazsınız (eklemediğiniz sürece). Bu sayısız karıştı. –

+1

Bir konsolda çalmak istediğinizde, her zaman 'raylar c';) kullanın –

5

gibi

scope :overdue where(:progress_date < Date.now-14.days) 
scope :due where(:progress_date < Date.now-7.days) 

Sonra çağıran kodu olabilir sınıf. Bu doğru:

def progress_report_status_check(progress_date) # Pass in a date 
    if (progress_date < (Date.today-14.days)) 
    "overdue" 
    elsif (progress_date < (Date.today-7.days)) 
    "due" 
    end 
end 
İlgili konular