2011-10-10 8 views
9

w Rails 3.0.10Dlaczego indeksy Rails Weekday są inne niż Ruby?

ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK 
=> {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 

I

ruby-1.9.2-p180 :011 > Date.today 
=> Mon, 10 Oct 2011 
ruby-1.9.2-p180 :012 > Date.today.wday 
=> 1 

Więc poniedziałek jest 0 w mapowaniu czasu, a 1 w Data mapowania.
https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/time/calculations.rb

Mam ochotę zacząć od niedzieli, ponieważ zero jest bezpieczniejsze, powszechniejsze i bardziej prawdopodobne, że zrozumie je ktoś inny. Miałem nadzieję, że zrozumiem historię/rozumowanie na wypadek, gdy coś przeoczę.

Mój przypadek użycia: Przechowuję dzień tygodnia bezpośrednio w mojej db. Pomyślałem, że przechowywanie jako liczba całkowita byłoby wydajniejsze i łatwiejsze w pracy niż przechowywanie "Monday", "Tuesday", itp.

PS Miałem świetny pomysł, aby zrobić coś takiego. Mapuj tam iz powrotem z łańcuchów w dni powszednie wewnątrz metod (ukrywając liczbę całkowitą).

ruby-1.9.2-p180 :010 > Time::DAYS_INTO_WEEK 
=> {:monday=>0, :tuesday=>1, :wednesday=>2, :thursday=>3, :friday=>4, :saturday=>5, :sunday=>6} 
Time::DAYS_INTO_WEEK[day_of_week.downcase.to_sym] 
Time::DAYS_INTO_WEEK.to_a.select{|k, v| v == start_day }.first.first.to_s.capitalize 
+1

Nie wiem, dlaczego indeksy są takie, jakie są, ale uruchamianie 'Date.today.wday' w' irb', a także 'raili c' obie dotyczą tego samego dnia tygodnia (tj. 1 w poniedziałek). Ten sam wynik z 'Time.now.wday'. Te informacje mogą być przydatne (http://makandra.com/notes/1074-deal-difail-ways-of-counting-weeks-and-weekdays-in-ruby). – Zabba

+0

Masz rację. "Problem", który mam, polega na tym, że dostępne mapowanie jest niespójne. Miałem nadzieję użyć wewnętrznego skrótu do mojego mapowania. (i dziękuję za link) –

+0

A w szynach są w rzeczywistości stałe - http://api.rubyonrails.org/classes/Date.html Spodziewałem się mieć ustawienie do odbioru na początku tygodnia. – Ninad

Odpowiedz

8

Nie jestem pewien, czy istnieje absolutnie poprawna odpowiedź na to pytanie. Sądzę, że Zabba miał coś wspólnego z różnicą między liczbą dni w Stanach Zjednoczonych a Kanadą i na świecie.

odniesieniu historycznego rozumowania, to wygląda jak David Heinemeier Hansson (DHH) wykonane następujące popełnienia w dniu 21 lutego 2005: https://github.com/rails/rails/commit/25f8a25c3ea107dcd0688307ac0ce19c4306f6b4

Komunikat popełnić wyraźnie stwierdza, że ​​to było zamierzone, aby początek tygodnia jest poniedziałek i nie w niedzielę. Biorąc pod uwagę, że David jest uznany, twórca Railsów, i nadal mieszkał w Danii w tym czasie, to ma sens, aby zignorować fakt, że zajęcia Data i czas Rubiego są rozważane w niedzielę 0.

(później Zatwierdź 1c5a6944d38e6818d254f272057b513b038b2270 przeniesiony days_into_week do stałej widzisz teraz DAYS_INTO_WEEK; później ta sama stała została dodana do klasy Date w commit bc1bcddede0c300e9c88f76a66a152814b734981).

+1

tak, zastanawiam się, dlaczego czas ruby ​​ma niedzielę jako 0 w dzień. Dla większości świata poniedziałek jest pierwszym dniem tygodnia. To irytujące, ponieważ baza danych, z którą pracujemy, jest ustawiona na poniedziałek jako 0. – Dmitry

Powiązane problemy