2015-10-20 3 views
0

Как я могу сортировать коллекцию записей по дате начала и окончания даты? Посмотрев на STRF docs ближе всего я мог бы получить было сгруппировать по номеру неделиRuby group_by date каждые 7 дней

weeks = my_data.group_by{|x| x.created_at.strftime('%U %Y') } 



{"34 2015"=> 
    [#<DoctorRecommendation:0x007fd663196ea0 
    created_at: Tue, 25 Aug 2015 22:29:44 UTC +00:00, 
    patient_profile_id: 104,], 
"33 2015"=> 
    [#<DoctorRecommendation:0x007fd663194ce0 
    created_at: Thu, 20 Aug 2015 13:41:37 UTC +00:00, 
    patient_profile_id: 21,, 
    #<DoctorRecommendation:0x007fd66319f500 
    created_at: Tue, 18 Aug 2015 02:47:30 UTC +00:00, 
    patient_profile_id: 61, 
    #<DoctorRecommendation:0x007fd66319db38 
    created_at: Tue, 18 Aug 2015 02:47:29 UTC +00:00, 
    patient_profile_id: 85, 
    ] 
    } 

Я предпочел бы иметь ключи быть 8/10/2015 - 8/16/2015 и 8/17/2015 - 8/23/2015

Есть несколько проблем с этим подходом. Во-первых, я не смог преобразовать его обратно в нужную дату (попробовал Date.parse("34 2015")), но получил ArgumentError: invalid date. Вторая проблема с этим подходом заключается в том, что определенные недели будут опущены, если не будет записей.

+1

8/10/2015 - 8/16/2015 и 8/17/2015 - 8/23/2015 FTFY –

ответ

2

Вы можете использовать расширение даты Rails, чтобы получить начало и окончание недели (конфигурируемый), а также использовать , что для создания диапазон:

weeks = my_data.group_by do |x| 
    date = x.created_at 
    left = date.beginning_of_week.strftime('%-m/%-d/%Y') 
    right = date.end_of_week.strftime('%-m/%-d/%Y') 
    "#{left} - #{right}" 
end 
1

Вот код, который делает то, что вы хотите, но с большим количеством синтаксического анализа даты. Кто-то лучше в Ruby, возможно, оптимизирует это.

my_data.group_by do |x| 
    date = Date.parse(x.created_at.strftime("%F")) 
    monday = date - date.strftime("%u").to_i 
    sunday = monday + 7 
    "#{monday.strftime("%F")} - #{sunday.strftime("%F")}" 
end 

Мое другое предложение, чтобы запросить минимальную дату created_at и сегодня, порождают все недели между с рубином очень быстро, а затем делать запросы. Это медленнее, если вы получаете все данные, но гораздо быстрее, если вам нужны только несколько недель.

Смежные вопросы