2013-05-03 6 views
5

Mam następujący kod w moim Rails 3 Zastosowanie:Porównaj Time.now in Rails, ale ignoruj ​​rok?

scope :active, lambda { 
    where("starts_at <= ? AND ends_at >= ?", Time.now.utc, Time.now.utc) 
    } 
    scope :since, lambda { |hide_time| 
    where("updated_at > ? OR starts_at > ?", hide_time.utc, hide_time.utc) if hide_time 
    } 

    def self.display(hide_time) 
    active.since(hide_time) 
    end 

Jednak chcę zwrócić wyniki, niezależnie od tego, czy rok pasuje obecny rok, czy nie. Dopóki dzień i miesiąc pasują, wszystko jest w porządku. czy to możliwe?

W starts_at i ends_at kolumny są datetime sformatowana. Więc automatycznie uwzględnią rok, nawet jeśli nie ustawię jednego w postaci:

<%= f.datetime_select :starts_at, :order => [:day, :month], :discard_year => true %> 

Wszelkie wskazówki byłyby mile widziane.

+0

mógłby zrobić prostą SQL dla tego jednego . – omarvelous

+0

Z jakiego RDBMS korzystasz? –

+0

Zakładam, że to oznacza typ bazy danych? Jeśli tak, to mySQL – dannymcc

Odpowiedz

2

Jak zauważa Old Pro w komentarzach, stanowi to problem w latach przestępnych. Prawdopodobnie chcesz podzielić każdy dzień na miesiąc MONTH (x) AND DAYOFMONTH (x).


Można użyć funkcji DAYOFYEAR https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_dayofyear

scope :active, lambda { 
    where("dayofyear(starts_at) <= dayofyear(?) AND 
     dayofyear(ends_at) >= dayofyear(?)", Time.now.utc, Time.now.utc) 
    } 
    scope :since, lambda { |hide_time| 
    where("dayofyear(updated_at) > dayofyear(?) OR 
     dayofyear(starts_at) > dayofyear(?)", hide_time.utc, hide_time.utc) if hide_time 
    } 

w mssql to

datepart (DAYOFYEAR, data)

w postgres to

ekstrakt (DOY od daty)

w sqlite3 to

strftime ("% j", data)

+0

Doskonale, dziękuję bardzo! – dannymcc

+1

@dannymcc Należy zauważyć, że to się nie powiedzie (zgodnie z ustalonym celem PO) przy porównywaniu daty po 28 lutego w roku przestępnym z datą w roku innym niż przestępny. Ten kod będzie miał 1-MAR-2000 == 2-MAR-2001. –