2012-12-06 18 views
5

Próbuję uzyskać pętlę, aby publikować filmy pogrupowane według dnia: created_at.Grupowanie według dni Created_At

Na przykład:

05 grudnia 2012 - wideo 9 video 8 wideo 7

4 grudnia 2012 - Wideo 6 Wideo 5

03 grudnia 2012 - Wideo 4 Wideo 3 Wideo 2 Wideo 1

videos_controller:

def index 
    @title = 'Hip Hop Videos, Breaking News, Videos, And Funny Shxt | HOTDROPHIPHOP' 
    @description = '' 
    @videos = Video.all 
    @days = Video.where(:created_at == Time.today) 
    end 

file:

<% @days.each do |day| %> 

    <div class="video-date">December 4, 2012</div> 

    <% @videos.each do |video| %> 
    <% end %> 

<% end %> 

również potrzebne, aby ta div aby pokazać, że datę dnia dzisiejszego, jak również.

Szukałem i nie mogłem znaleźć rozwiązania i wypróbowałem group_by (które wydawało się najczystsze), ale nie mogłem go uruchomić. Jestem trochę zardzewiały na moich Railsach, ponieważ nie dotykałem go od miesięcy.

Odpowiedz

11

można zrobić t jego:

@videos = Video.where(Video.arel_table[:created_at].gteq(some_date_value)) 
@video_days = @videos.group_by {|video| video.created_at.to_date } 

Gdzie @video_days będzie hash w postaci {some_date_value: [{video1}, {video2}, etc], next_date_value: [{video3}, {video4}, etc], etc...}.

Ponieważ wywołujesz .to_date w polu created_at, usunie wszystkie informacje o czasie, skutecznie grupując wszystko według dnia.

Można pętli nim podoba:

<% @video_days.each do |day, videos| %> 
    <%= day.strftime("some format") %> 
    <% videos.each do |video| %> 
    <%= #output videos how you see fit %> 
    <% end %> 
<% end %> 
+0

Wygląda na to, jak najlepiej to zrobić, dzięki! Jednak problemy z strftime. Dając mi błąd: nieokreślona metoda 'strftime 'dla # . Wyświetlane jako niezdefiniowana metoda. –

+0

Jak budujesz swoją pętlę? Robię to lokalnie w konsoli rails: '@video_days.each {| date, video | date.class} 'i drukuje' Date'. To powinno działać. –

+0

Hm ... daje mi błąd składniowy | zamiast} –

1

Po pierwsze nie ma sensu wywoływać tylko wideo od dzisiaj, a następnie przeglądać wszystkie filmy.

chciałbym spróbować to w ten sposób:

Controller

@videos = Video.all(:conditions => ["created_at >= ?", Date.today.at_beginning_of_month]) 

Zobacz

<% Date.today.at_beginning_of_month.upto(Date.today).each do |date| %> 
    <%= date %>: <%= @videos.select{|u| u.created_at == date }.title %> 
<% end %> 

To powinno dać listę wideo z "Data: Tytul" dla bieżącego miesiąca.

1

Przyjęto używasz MySQL i wideo ma atrybut title jestem delegowania poniższy kod, żeby pomóc zrozumieć logikę (na pewno musi to re-factoring)

Controller

@videos = {} 
videos = Video.order("DATE(created_at) DESC, title ASC").select("DATE(created_at) as created_at, title, id") 

videos.collect{|x| @videos[x.created_at.to_s] = @videos[x.created_at.to_s] ? @videos[x.created_at.to_s] << x.title : [x.title] } 

widok

<% @videos.each do |posted_date, videos| %> 
    <div class="video-date"><%= Date.parse(posted_date.to_s).strftime("%b %d, %Y") %> </div> 
    <%= videos.join(", ") %> 
<% end %> 
2

Najlepszym sposobem jest użycie gem Groupdate

np User.group_by_day(:created_at).count

Pozwala na zamówienie przez dzień, tydzień, godzina

Powiązane problemy