2016-09-30 5 views
5

मैं आरओआर और पोस्टग्रे के लिए काफी नया हूं और मुझे इसे प्राप्त करने में परेशानी है।समूह_बी - रुबी/रेल + पोस्टग्रेर्स

मेरे पास एक वर्किंग_हॉर मॉडल और एक मर्चेंट मॉडल है, जहां व्यापारी के पास काम कर रहा है और काम कर रहा है और काम कर रहा है। व्यापारी के पास उसी दिन के लिए दो या मोर काम कर सकते हैं।

मेरा विचार:

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

जब मैं दृश्य दिन द्वारा आदेश दिया पर प्रदर्शित डेटा पुनः प्राप्त कर रहे हैं (ध्यान दें कि खुलने का समय अव्यवस्थित हैं):

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

मैं द्वारा समूहीकृत करना चाहते हैं सप्ताह के दिन और सप्ताह के दिन और दूसरा खुलने का समय:

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

लेकिन जैसा कि आप देख सकते हैं, वर्तमान में, मैं रूबी परत का उपयोग कर रहा हूं जो प्रदर्शन समस्याओं को लाता है। डेटाबेस परत का उपयोग करके इसे कैसे प्राप्त किया जा सकता है?

+0

कोशिश खोज - सप्ताह के postgres समूह - मैं mysql के साथ और फिर कुछ लेख को पढ़ने के बाद ही समस्या थी एसक्यूएल के और अधिक सीखा है और मैं यह किया है, तो में कक्षा स्तर पर इसकी विधि सिर्फ कस्टम चयन रेल ... –

+0

क्या आपके पास कोई 'default_scope' है जो ऑर्डर के साथ गड़बड़ कर रहा है? – Pavan

+0

नहीं @ पवन। कोई डिफ़ॉल्ट_स्कोप नहीं। – user1301037

उत्तर

2

त्वरित Postgres उदाहरण है अगर आप डीबी तालिका में डेटा (बेतरतीब ढंग से बनाई गई डाटासेट पर) स्टोर करने के लिए तैयार हैं:

-- 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 प्रलेखन लिंक है कि काम में आ सकता है:

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

पीएस आशा है कि डेटाबेस में इसे हल करने के बारे में कुछ विचार दें।

+0

मैं इसे रेल पर कैसे कॉल कर सकता हूं? स्कोप का उपयोग करना? क्या आप मुझे एक उदाहरण दे सकते हैं कि इस क्वेरी को रेल में कैसे सारणीबद्ध करें? – user1301037

+0

@ user1301037 - मैं रूबी पर विशेषज्ञ नहीं हूं, लेकिन इस तरह के दिए गए उदाहरणों पर एसक्यूएल सहायता निष्पादित करने के लिए Activerecord का उपयोग नहीं कर रहा हूं: http://stackoverflow.com/questions/14824453/rails-raw-sql- उदाहरण ? –

2

कामकाजी घंटे को open_hour द्वारा आदेश दिया जाना चाहिए क्योंकि आप आरोही क्रम में यूआई में शुरुआती घंटा दिखाएंगे। एक बार कामकाजी घंटे का आदेश देने के बाद, परिणाम दिन भर समूहीकृत किया जा सकता है।

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

आपको यह बताना चाहिए कि यह उत्तर प्रश्न का उत्तर कैसे देता है। – 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

आप क्यों नहीं बस दो क्षेत्रों से आदेश नहीं कर सकते हैं: "दिन" से और "opening_hour" द्वारा?

<% @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 %> 
संबंधित मुद्दे