2011-02-11 6 views
7

मेरे पास एक बड़ा डेटा सेट है जिसे मैं उपयोगकर्ता के लिए साफ़ करना चाहता हूं। ,रूबी/रेल - एक ऐरे में एक क्वेरी परिणाम कैसे एकत्रित करें?

ID | project_id | thread_id | action_type |description 
1 | 10   | 30  | comment | yada yada yada yada yada 
1 | 10   | 30  | comment | xxx 
1 | 10   | 30  | comment | yada 313133 
1 | 10   | 33  | comment | fdsdfsdfsdfsdfs 
1 | 10   | 33  | comment | yada yada yada yada yada 
1 | 10   |   | attachment | fddgaasddsadasdsadsa 
1 | 10   |   | attachment | xcvcvxcvxcvxxcvcvxxcv 

अभी जब मैं आउटपुट के रूप में ऊपर मेरी बहुत उसी क्रम में अपने ध्यान में रखते हुए ऊपर, समस्या यह बहुत दोहराव है: डेटा डीबी से सेट कुछ इस तरह लग रहा है। उदाहरण के लिए, PROJECT_ID के लिए 10 & thread_id 30 आप देखते हैं:

10 - 30 - yada yada yada yada yada 
10 - 30 - xxxxx 
10 - 30 - yada yada yada yada yada 

मैं रूबी में करने के लिए कैसे जानने के लिए करना चाहते हैं क्या, कुछ कैसे एक PROJECT_ID और thread_id के तहत एक सरणी और aggreate विवरण बनाने है, इसलिए बजाय उत्पादन है:

10 - 30 
- yada yada yada yada yada 
- xxxxx 
- yada yada yada yada yada 

कहां से शुरू किया जाए इस पर कोई सलाह है? यह आवश्यकता मेरे लिए नई है, इसलिए मैं इस बारे में आपके विचारों की सराहना करता हूं कि आप इसे हल करने का सबसे अच्छा तरीका क्या सोच रहे हैं। खुशी से यह रूबी में किया जा सकता है और एसक्यूएल नहीं, क्योंकि ईवेंट फीड में गतिविधि फ़ीड बढ़ने की संभावना है और जटिलता।

धन्यवाद

+0

एसक्यूएल दृष्टिकोण के लिए ग्रुप बाय का उपयोग करें। रूबी दृष्टिकोण के लिए संख्यात्मक # group_by का उपयोग करें। दस्तावेज़ों की जांच करें। – tokland

+1

यह डेटा किस प्रकार लेता है? क्या यह ActiveRecord ऑब्जेक्ट्स या JSON ऑब्जेक्ट्स या कुछ और है? –

+0

@ पैन, यह डेटा एक ActiveRecord ऑब्जेक्ट है, जैसे @activity – AnApprentice

उत्तर

10

उपयोग group_byhttp://apidock.com/rails/Enumerable/group_by रूबी में या सही एसक्यूएल में। रूबी में:

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") } 

तो फिर तुम उस तरह हैश मिल जाएगा:

{ "10 - 30" => [#DataSet1, #DataSet2 ...], "10 - 33" => [#DataSet7, #DataSet11 ...] 

जो तुम ध्यान में रखते हुए पार्स कर सकते हैं:

<% sets.each do |range, datas| %> 
    <p><%= range %>:</p> 
    <% datas.each do |data| %> 
    <p><%= data.description %></p> 
    <% end %> 
<% end %> 

each_with_index

<% sets.each_with_index do |datas, index| %> 
    <p><%= datas[0] %>:</p> 
    <% datas[1].each do |data| %> 
    <p><%= data.description %></p> 
    # some stuff with *last* 
    <%= "This is the last one" if data == datas[1].last %> 
    <% end %> 
<% end %> 
के लिए युपीडी
+0

यह सबसे प्रभावशाली चीज है जिसे मैंने अभी तक रेल देखा है। – AnApprentice

+0

मुझे एक इंडेक्स की आवश्यकता समाप्त हो गई, इसलिए मैंने इसे <% sets.each_with_index ....... में बदल दिया। समस्या लूप के अंदर है, मुझे datas.last करने की ज़रूरत है और जब मैं प्रत्येक_with_index का उपयोग करता हूं तो वह टूट जाता है। विचार? – AnApprentice

+0

मैंने उत्तर अपडेट किया है – fl00r

0

मैं Enumerator की group_by विधि का उपयोग करने के लिए एक सरल दिशानिर्देश का पालन करता हूं। - संचालित होने वाले डेटा-सेट को छोटे और निश्चित और समय के साथ स्थिर रहने की गारंटी दी जानी चाहिए।

उदाहरण के लिए:

Fixed data-set: Zip codes, city names  
Dynamic but small data-set: User's hobbies  
Dynamic but paginated data-set: First page of latest orders. 

मेरी राय अपनी गतिविधि फ़ीड तालिका समय के साथ तेजी से बढ़ने सकते हैं। Activity.all सभी गतिविधियों को स्मृति में लोड करता है। आप इस कॉल को निष्पादित करके अत्यधिक मेमोरी और नेटवर्क लागतें ले रहे हैं। all निष्पादित शर्तों और अंकन के साथ कॉल करने का कभी भी अच्छा विचार नहीं है। यदि आप वर्तमान में परिणाम सेट पर पेजिंग कर रहे हैं, तो वर्तमान समाधान तब काम नहीं करेगा जब परिणाम-सेट एकाधिक पृष्ठों को फैलाता है। सही परिणाम-सेट प्राप्त करने के लिए आपको order खंड का उपयोग करना होगा। के रूप में fl00r ने सुझाव दिया है कि आप अपने ध्यान में रखते हुए @activity_groups उपयोग कर सकते हैं,

# order by ensures that ordering happens at the DB 
# pagination and conditions ensures that data set is small 
activities = Activity.paginate(:order => "project_id, thread_id", :page => #pn) 
@activity_groups = activities.group_by{|a| "#{a.project_id} - #{a.thread_id}"} 

अब:

अपने नियंत्रक में:

यह मैं क्या करना होगा है।

संबंधित मुद्दे