2016-09-30 48 views
5

Ben ROR ve Postgre'nin oldukça yeni ve bunu başarmak için ben belada.Group_by - Ruby/Raylar + Postgres

Bir work_hour Modeline ve bir tüccar has_many working_hours ve working_hour'un Merchant'a ait olduğu bir Satıcı Modeline sahibim. Satıcı aynı gün için iki veya daha fazla işçiye sahip olabilir.

Bence: Ben geçen gün sipariş manzaraya görüntülediğimizde

<% @merchant.working_hours.order(:day).group_by(&:day).each do |dia, whs| %> 
    <%= t(:"date.abbr_day_names")[dia.to_i] %> : 
    <% whs.each do |wh| %> 
     <li> 
     <%= wh.oppening_hour.to_formatted_s(:time) %> - 
     <%= wh.close_hour.to_formatted_s(:time) %> 
     </li> 
    <% end %> 
    <% end %> 

alınan verilerdir (Açılış saati sırasız olduğunu unutmayın):

Mon: 
17:00-20:00 
10:00-13:00 
Tue: 
18:00-21:00 
10:00-13:00 

Ben göre gruplandırmak istediğiniz haftanın günü ve ilk olarak haftanın ilk günü ve ikinci olarak açılış saati:

Mon: 
10:00-13:00 
17:00-20:00 
Tue: 
10:00-13:00 
18:00-21:00 

Gördüğünüz gibi, şu anda performans sorunlarını getiren şeyi yapmak için ruby ​​katmanını kullanıyorum. Bunu veritabanı katmanını kullanarak nasıl başarabilirim?

+0

deneyin arama - haftasında postgres grup - i mysql ile ve daha sonra bazı makaleler okuduktan sonra aynı sorunu vardı sql daha öğrendim ve ben o zaman sınıf düzeyinde onun sadece özel seçme yöntemi raylar, did it ... –

+0

Siparişle uğraşan herhangi bir 'default_scope'unuz var mı? – Pavan

+0

No @Pavan. Hiçbiri default_scope. – user1301037

cevap

2

Hızlı Postgres örnek (rastgele oluşturulan veri kümesi üzerine) DB tablodaki verileri depolamak çekinmiyorsanız: kullanışlı gelebilir

-- The query: 
SELECT  to_char(mytime, 'day') as weekday,    -- example to get weekday name 
      extract(dow from mytime) as weekday_num,   -- example to get weekday number 
      format(           -- format the way example output was given 
       '%s - %s', 
       date_trunc('hour', opening_time)::time(0), -- get opening hour (without milliseconds) 
       date_trunc('hour', closing_time)::time(0)  -- get closing hour (without milliseconds) 
      ) as working_hours 
FROM  mytable 
GROUP BY mytime,   -- to secure accurate ordering by timestamp 
      weekday,   
      working_hours 
ORDER BY mytime, 
      working_hours; 

-- Result: 
    weekday | weekday_num | working_hours 
-----------+-------------+--------------------- 
monday |   1 | 08:00:00 - 17:00:00 
tuesday |   2 | 08:00:00 - 16:00:00 
tuesday |   2 | 08:00:00 - 17:00:00 
wednesday |   3 | 08:00:00 - 12:00:00 
thursday |   4 | 08:00:00 - 12:00:00 
thursday |   4 | 08:00:00 - 16:00:00 
friday |   5 | 08:00:00 - 15:00:00 
friday |   5 | 08:00:00 - 18:00:00 

Postgres dokümantasyon bağlantıları:

https://www.postgresql.org/docs/current/static/functions-datetime.html https://www.postgresql.org/docs/current/static/functions-formatting.html https://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-FORMAT

PS Umarım veritabanında nasıl çözüleceğine dair bazı fikirler verir.

+0

Bunu raylarda nasıl arayabilirim? Kapsam Kullanımı? Bu sorgunun raylara nasıl soyutlanacağıyla ilgili bir örnek verebilir misiniz? – user1301037

+0

user1301037 @ - Ben Ruby konusunda uzman değilim, ama burada böyle Verilen örnekte (ler) SQL yardım yürütmek için activerecord kullanmıyor: http://stackoverflow.com/questions/14824453/rails-raw-sql- örnek ? –

2

Açılış saatini artan sırada göstereceğiniz için çalışma saati, open_hour tarafından sipariş edilmelidir. Çalışma saati sipariş edildikten sonra, sonuç güne göre gruplanabilir.

<% @merchant.working_hours.order(:opening_hour).group_by(&:day).each do |dia, whs| %> <%= t(:"date.abbr_day_names")[dia.to_i] %> : <% whs.each do |wh| %> <li> <%= wh.opening_hour.to_formatted_s(:time) %> - <%= wh.close_hour.to_formatted_s(:time) %> </li> <% end %> <% end %>

+0

Bu cevabın soruyu nasıl yanıtladığını açıklamalısınız. – Smar

2
<% day = nil %> 
<% @merchant.working_hours.order(:day, :oppening_hour).each do |wh| %> 
    <% if wh.day != day %> 
    <% day = wh.day %> 
    <%= t(:"date.abbr_day_names")[day.to_i] %> : 
    <% end %> 
    <li> 
    <%= wh.oppening_hour.to_formatted_s(:time) %> - 
    <%= wh.close_hour.to_formatted_s(:time) %> 
    </li> 
<% end %> 
0

sadece iki alanlara göre sipariş edemez Neden: "gün" tarafından ve "opening_hour" tarafından?

<% @merchant.working_hours.order(:day).order(:oppening_hour).group_by(&:day).each do |dia, whs| %> 
    <%= t(:"date.abbr_day_names")[dia.to_i] %> : 
    <% whs.each do |wh| %> 
     <li> 
     <%= wh.oppening_hour.to_formatted_s(:time) %> - 
     <%= wh.close_hour.to_formatted_s(:time) %> 
     </li> 
    <% end %> 
    <% end %>