2012-12-06 27 views
5

created_at tarafından her gün gruplandırılmış videolar göndermek için bir döngü oluşturmaya çalışıyorum. ÖrneğinGünlere Göre Gruplama Oluşturuldu_At

: -

5 Aralık 2012 - Video 9 Video 8 Video 7

4 Aralık 2012 - 5

3 Aralık 2012 video 6 video Video 2 Video 3 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 

Görünüm dosyası:

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

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

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

<% end %> 

Ben de hem o günün tarihini göstermek için, o div almak gerekir.

Çevreyi aradım ve bir çözüm bulamadım ve group_by denedim (ki en temiz görünüyordu) ama işe yaramayacaktı. Raylarıma biraz paslıyım çünkü aylardır dokundum.

cevap

11

onun: @video_days{some_date_value: [{video1}, {video2}, etc], next_date_value: [{video3}, {video4}, etc], etc...} şeklinde bir karma olacak

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

.

created_at alanına .to_date numaralı telefonu aradığınızdan bu yana, her zaman etkili bir şekilde her şeyi gruplandırarak tüm zaman bilgileri düşecektir.

Sen içinden döngü beğenebilir:

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

Bunu yapmanın en iyi yolu gibi görünüyor, Teşekkürler! Ancak, strftime ile sorun yaşıyorsanız. Bana hata veriyor: undefined method 'strftime 'için # . Tanımlanmamış yöntem olarak gösteriliyor. –

+0

Döngününüzü nasıl kuruyorsunuz? Bunu yerel olarak raylar konsolunda yapıyorum: '@video_days.each {| date, video | date.class} 've' Tarih'i basıyor. Bu işe yaramalı. –

+0

Hm ... bana bir sözdizimi hatası veriyor | –

1

Her şeyden önce, yalnızca bugün videoları aramak ve daha sonra tüm videolarda yayınlamak hiç mantıklı değil.

ben bu şekilde denemek istiyorum:

Kontrolör

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

Görünüm

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

Size "Tarih: Video Başlığı" ile Video listesini vermelidir fiili ay için.

1

(Şüphesiz gerek yeniden faktoring)

Kontrolörü Eğer mysql kullanıyorsanız ve video sana mantığını kavramak için yardımcı için aşağıdaki kodu ilanıyla şampiyonluğunu özniteliği vardır Varsayalım

@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] } 

görünümü Sen t yapabilirsiniz

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

iyi yolu gem kullanmaktır Groupdate

örn

User.group_by_day(:created_at).count Eğer gün, hafta tarafından sipariş ver, saat