2012-12-06 17 views
5

Ich versuche eine Schleife zu bekommen, um Videos nach jedem Tag von created_at zu veröffentlichen.Gruppierung nach Tagen Created_At

Zum Beispiel:

5. Dezember 2012 - Video 9 Video 8 Video 7

4. Dezember 2012 - Video 6 Video 5

3. Dezember 2012 - Video 4 Video 3 Video 2 Video 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 

View file: auch

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

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

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

<% end %> 

Ich brauche auch, dass die div zu bekommen, dass Datum des heutigen Tages zu zeigen.

Ich suchte herum und konnte keine Lösung finden und probierte das group_by (das am saubersten schien), konnte es aber nicht zum Laufen bringen. Ich bin ein wenig eingerostet auf meinen Schienen, da ich seit Monaten nicht mehr berührt habe.

Antwort

11

können Sie t tun sein:

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

Wo @video_days wird ein Hash in Form von {some_date_value: [{video1}, {video2}, etc], next_date_value: [{video3}, {video4}, etc], etc...} sein.

Da Sie .to_date auf dem Feld created_at aufrufen, wird es die ganze Zeitinformation fallen lassen, effektiv alles bis zum Tag gruppierend.

Sie können Schleife durch sie mag:

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

Sieht nach dem besten Weg aus, Danke! Allerdings Probleme mit der strftime. Gib mir Fehler: undefinierte Methode 'strftime 'für # . Wird als undefinierte Methode angezeigt. –

+0

Wie bauen Sie Ihre Schleife? Ich mache das lokal in der Rails-Konsole: '@video_days.each {| date, video | date.class} 'und es druckt' Date'. Das sollte funktionieren. –

+0

Hm ... gibt mir einen Syntaxfehler | statt} –

1

Zunächst macht es keinen Sinn, nur Videos von heute anzurufen und dann alle Videos zu durchlaufen.

Ich würde versuchen, es so aus:

-Controller

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

Ansicht

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

Es sollten Sie eine Video-Liste geben mit "Datum: Video-Titel" für den aktuellen Monat.

1

Angenommene Sie MySQL und Video hat Titel Attribut ich den folgenden Code bin Entsendung Sie die Logik begreifen zu helfen (Sicher braucht es wieder 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] } 

Ansicht

<% @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

Der beste Weg ist die Perle Groupdate

zB User.group_by_day(:created_at).count

Lassen Sie von Tag verwenden bestellen, Woche, Stunde

Verwandte Themen