Order => datetime ASC

witam, wyszukuję wszystkie wątki w ten sposób
<% for thisday in Eventday.find(:all, :conditions => {:day => pars}, :include => :event, :order => ‘events.starttime ASC’).each %>
i najbardziej zastanawia mnie klauzura order => 'events.starttime ASC ’ wszystko jest niby idealnie jednak gdy wyświetlam dane zauważyłem
że nie są poselekcjonowane wg godziny
wyświetlam :
<%=h thisday.event.starttime.strftime("%H:%M") %>
otrzymuje
( w danym dniu )

  1. 05:36
  2. 10:30
  3. 10:25

a powinno być

  1. 05:36
  2. 10:25
  3. 10:30

starttime jest typem pola datetime

A może nie jest zrypane to sortowanie, tylko to jak jest określony dzień?

<% for cośtam in cośtams %> albo <% cośtams.each do |costam| %> Według mnie. To po pierwsze, po drugie nie umieszczaj takich findów w widokach, bo mieszasz funkcjonalności, to powinno być w kontrolerze.
Hm… w dokumentacji finda nie widzę, żeby tam był parametr :include.

oj jest, służy do ładowania podmodeli :slight_smile:

Racja, patrzyłem na find z ActiveResource, a nie ActiveRecord. Mój błąd.

no jak masz jakies watpliwosci to irb i sprawdz zapytanie recznie, w logach bedziesz mial co z tego cuda twojego sie wygenerowalo za zapytanie
mozesz je tez w bazie danych zapodac i zobaczyc jak sie dane ukladaja

temat rozpoznany bład jest w kolumnie starttime która posiada datę ( ktróra jest niepoprawn) oraz czas ( który jak najbardziej jest prawidłowy)
czy jest możliwość aby zapytanie
<% for thisday in Eventday.find(:all, :conditions => {:day => pars}, :include => :event, :order => ‘events.starttime ASC’).each %>
ograniczyć do selekcji z kolumby ‘events.starttime’ tylko pod względem wpisanej tam godziny ??

mozesz zapytanie sql tak ulozyc by wyciagnac tylko godziny. Sql te zpotrafi formatowac daty/godziny. Nie wiem z jakies bazy korzystasz wiec nie pomoge.

MySQL

SELECT day(events.starttime)
SELECT hour(events.starttime)

I tak dalej. Mam Nadzieje ze mechanizm rozumiesz. Przy takim zapytaniu ja korzystam praktycznie zawsze z find_by_sql i pisze recznie sql no ale to zalezy jak znasz sie na sql. Ja lubie miec pelna kontrole nad nim.

:confused:

[code]>> Eventday.find(:all, :conditions => {:day => ‘2009-09-20’}, :include => :event, :order => ‘hour(events.starttime)’)
±----±------------------------±------------------------±------------------------±---------+
| id | day | created_at | updated_at | event_id |
±----±------------------------±------------------------±------------------------±---------+
| 166 | 2009-09-20 00:00:00 UTC | 2009-09-15 05:36:45 UTC | 2009-09-15 05:36:45 UTC | 35 |
| 171 | 2009-09-20 00:00:00 UTC | 2009-09-17 10:31:19 UTC | 2009-09-17 10:31:19 UTC | 36 |
| 173 | 2009-09-20 00:00:00 UTC | 2009-09-19 10:26:07 UTC | 2009-09-19 10:26:07 UTC | 37 |
±----±------------------------±------------------------±------------------------±---------+
3 rows in set

Event.find(:all)
±—±---------±------------±----------±------------±-----------------±-----±------±------------±--------------------±--------------------±--------------------+
| id | place_id | category_id | number_id | title | body | when | photo | title_photo | created_at | updated_at | starttime |
±—±---------±------------±----------±------------±-----------------±-----±------±------------±--------------------±--------------------±--------------------+
| 35 | 2 | 8 | 7 | rozmaitości | body rozmaitości | | | | 2009-09-15 05:36… | 2009-09-15 05:36… | 2009-09-15 05:36… |
| 36 | 1 | 3 | 9 | fhxfth | xfhxfthtfxh | | | | 2009-09-17 10:31… | 2009-09-17 10:31… | 2009-09-17 10:30… |
| 37 | 1 | 2 | 9 | test muzyka | test muzyka body | | | | 2009-09-19 10:26… | 2009-09-19 10:26… | 2009-09-19 10:25… |
±—±---------±------------±----------±------------±-----------------±-----±------±------------±--------------------±--------------------±--------------------+[/code]
nie moge sobie z tym poradzić :confused:

problem rozwiązany zapewne spalicie mnie tutaj na stosie za takie rozwiązanie ale jak na razie na mój zasób wiedzy na więcej nie mogę sobie pozwolić:P
odpowiedz: select jest dobry
zmieniłem w widoku
<%= f.datetime_select (:starttime, :start_year => 2000, :default => { :month => 4, :day => 1, :year => 2000 }, :discard_year => ‘true’, :discard_month => ‘true’ ) %>
teraz nie ma problemów z wyszukiwaniem bo na stałe jest wpisanny miesiąc dzień i rok i układa prawidłowo po godzinach :stuck_out_tongue: :)))

>> Event.find(:all) +----+----------+-------------+-----------+-------------+------------------+------+-------+-------------+---------------------+---------------------+---------------------+ | id | place_id | category_id | number_id | title | body | when | photo | title_photo | created_at | updated_at | starttime | +----+----------+-------------+-----------+-------------+------------------+------+-------+-------------+---------------------+---------------------+---------------------+ | 35 | 2 | 8 | 7 | rozmaitości | body rozmaitości | | | | 2009-09-15 05:36... | 2009-09-15 05:36... | 2009-09-15 05:36... | | 36 | 1 | 3 | 9 | fhxfth | xfhxfthtfxh | | | | 2009-09-17 10:31... | 2009-09-17 10:31... | 2009-09-17 10:30... | | 37 | 1 | 2 | 9 | test muzyka | test muzyka body | | | | 2009-09-19 10:26... | 2009-09-19 10:26... | 2009-09-19 10:25... | | 38 | 1 | 1 | 9 | fthfxh | hfhtdfdthfth | | | | 2009-09-22 15:31... | 2009-09-22 15:31... | 2009-09-22 15:25... | | 39 | 1 | 3 | 9 | dfhf | fyhfh | | | | 2009-09-22 15:38... | 2009-09-22 15:38... | 2009-09-22 15:30... | | 40 | 2 | 6 | 9 | sre | fyhfhserer | | | | 2009-09-22 16:06... | 2009-09-22 16:06... | 2000-04-01 15:30... | | 41 | 1 | 8 | 9 | sewrr | serser | | | | 2009-09-22 16:06... | 2009-09-22 16:06... | 2000-04-01 16:08... | | 42 | 1 | 2 | 9 | eeee | eeee | | | | 2009-09-22 16:07... | 2009-09-22 16:07... | 2000-04-01 16:06... | +----+----------+-------------+-----------+-------------+------------------+------+-------+-------------+---------------------+---------------------+---------------------+ 8 rows in set
jak widać to co jest “starsze” niż id = 39 będzie już prawidłowo się wyświetlało wg godzin :stuck_out_tongue:

nie ma co oceniac i komentowac, kazdy zaczynal kiedys i teraz jak po latach odgrzebuje swoje stare projekty sprzed kilku lat to za glowe sie lapie i ze wstydu pali jak mogl takie rzeczy robic. Naturalny proces.

a tak poza tym nie bardzo juz kumam co chcesz osiagnac i jak to masz zbudowane. Jesli chcesz tylko godziny to po co typ datetime samo time bylo by ok, no i wtedy w formularzu:

no właśnie ująłeś sedno sprawy błędnie zaprojektowana baza co ciągnie za sobą właśnie takie problemy, oczywiście powinienem zastosować typ time

to w formularzu zrób timeselecta, a potem w kontrolerze zamieniaj time na datetime z datą jakąś stałą - np. 0001-01-01 albo dowolny inny stały dzień.

już to zrobiłem za jednym zamachem w widoku :slight_smile: <%= f.datetime_select (:starttime, :start_year => 2000, :default => { :month => 4, :day => 1, :year => 2000 }, :discard_year => ‘true’, :discard_month => ‘true’ ) %>

no ale tez nie problem zrobic to porzadnie:

mysql nazwa_bazy
ALTER TABLE nazwa ALTER COLUMN nazwa TYPE time;

i tyle pozniej tylko w aplikacji w db/migrate/ktorastam zmienic recznie datetime na time, no i chyba tez w db/schema

i tyle masz poprawione a nie takie kosmosy tworzysz. Moznesz tez dac
./script/generate migration
i w nowej migracji ta zmiane zapodac. No ale ja zawsze wole pierwszy sposob.

A jak dopiero tworzysz i nie masz tam danych to i bez 1 punktu da rade tylko dropnac ta tabele i poprawiona znowu zrobic na nowo i tyle