2015-09-02 12 views
10

द्वारा एकाधिक सरणी लूपिंग मैं कई सरणियों देख रहा हूँ, लेकिन उन्हें वर्ष के आधार पर किसी तालिका में संरेखित साथ परेशानी हो रही। फिलहाल डेटा इसी वर्ष के साथ नहीं मिलाया गया है, डेटा किसी भी वर्ष में मौजूद रहने पर यह सिर्फ पहली पंक्ति पर डेटा देता है, तो स्थानों '0' आराम के लिए डेटा, यानी। वर्ष के साथ संरेखित नहीं है।साल

देखें

<table> 
<% @a.zip(@b, @c, @d) do |a, b, c, d| %> 
<tr> 
    <td><%= a.year %></td> 
    <% if a.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= a.id %></td> 
    <td><%= a.data %></td> 
    <% end %> 
    <% if b.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= b.id %></td> 
    <td><%= b.data %></td> 
    <% end %> 
    <% if c.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= c.id %></td> 
    <td><%= c.data %></td> 
    <% end %> 
    <% if d.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= d.id %></td> 
    <td><%= d.data %></td> 
    <% end %> 
</tr> 
</table> 

नियंत्रक

@a = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').order('year ASC') 

@b = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '0').order('year ASC') 

@c = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '1').order('year ASC') 

@d = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '2').order('year ASC') 
+0

कृपया अपनी मेज और आउटपुट स्वरूप आप चाहते हैं में डेटा स्वरूप का उल्लेख है। – seahawk

+0

मैं कुछ परेशानियों हो रही क्या सवाल करना चाहता है, तो आप नीचे डेटा से अपने आप को स्पष्ट रूप से ** नहीं प्रश्नों ** और प्रारूप आप पाठ में लिख सकता है। –

+0

@ डोलरचिल, मैंने नीचे आपकी समस्या का समाधान प्रस्तावित किया है। मुझे उम्मीद है कि मैं इसे सही समझूंगा। अगर यह आपकी जरूरतों के अनुरूप है तो मुझे बताएं। (: साल और) ' – dimakura

उत्तर

4

मुझे लगता है कि आप इस तरह से प्रयास कर सकते हैं। इसमें आपको खाली मूल्यों की जांच करने की आवश्यकता नहीं है। मैं आशा @a अपने सभी उपलब्ध साल अन्यथा आप साल

<table> 
<% @a.each do |a| %> 
<tr> 
    <td><%= a.year %></td> 
    <td><%= (a.id || 0 rescue 0) %></td> 
    <td><%= (a.data || 0 rescue 0) %></td> 
    <td><%= (@b.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@b.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
    <td><%= (@c.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@c.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
    <td><%= (@d.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@d.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
</tr> 
<% end %> 
</table> 

के माध्यम से सभी वर्षों एक पाश मर्ज करने के लिए की जरूरत है शामिल अपने @a नहीं सभी वर्षों फिर बस से

years = ((@a.collect{|h| h["year"]}) + (@b.collect{|h| h["year"]}) + (@c.collect{|h| h["year"]}) + (@d.collect{|h| h["year"]})).uniq 

तो यह विलय करने की कोशिश शामिल है, तो तुम सिर्फ साल सरणी के माध्यम से पाशन कर सकते हैं के रूप में:

<% years.each do |year| %> 
    <tr> 
     <td><%= year %></td> 
     <td><%= (@a.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@a.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@b.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@b.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@c.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@c.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@d.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@d.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
    </tr> 
    <% end %> 
    </table> 
1

आप शायद अपने ध्यान में रखते हुए इसका मतलब:

<% 
    A = @a.group_by{|a| a.year} 
    B = @b.group_by{|b| b.year} 
    C = @c.group_by{|c| c.year} 
    D = @d.group_by{|d| d.year} 
%> 

<table> 
    <% A.each do |year, a| %> 
    <% b = B[year] %> 
    <% c = C[year] %> 
    <% d = D[year] %> 
    <tr> 
     <td><%= year %></td> 
     <% if a.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <%= a.id %> 
     <%= a.data %> 
     <% end %> 
     <% if b.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= b.id %></td> 
     <td><%= b.data %></td> 
     <% end %> 
     <% if c.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= c.id %></td> 
     <td><%= c.data %></td> 
     <% end %> 
     <% if d.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= d.id %></td> 
     <td><%= d.data %></td> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

मैं यहाँ मान @a सभी वर्षों अन्य सारणियों हो सकती है (के आधार पर क्वेरी)। यदि यह मामला नहीं है, तो आपको सबसे पहले वर्षों की पूर्ण सरणी बनाने की आवश्यकता है:

<% years = (A.keys + B.keys + C.keys + D.keys).uniq %> 
<table> 
    <% years.each do |year| %> 
    <% a = A[year] %> 
    <!-- the rest is the same, as above --> 
    <% end %> 
</table> 
+0

धन्यवाद दिमाकुरा, मैंने इस विधि की कोशिश की है और कोई भाग्य नहीं है। मैं पहले से ही नियंत्रक में साल भर समूह कर रहा हूँ। – DollarChills

+0

मुझे अपरिभाषित विधि 'आईडी' मिलती है जहां 'b.id' शुरू होता है। – DollarChills

+0

@DollarChills तुम मुझे दिखा सकते है क्या या आप कैसे उन सरणियों – dimakura

1

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

@results_by_year = Result.where(your_conditions).group_by(&:year) 
# this retrieves all the Result records wanted, without taking care of the record's `year` 

हैश की संरचना इस तरह होगा:

# { 2010: [<Result id:1>, <Result id:3>], 
# 2012: [<Result id:2>], 
# 2014: [<Result id:7>, <Result id:9>] } 

ध्यान में रखते हुए:

@results_by_year.each do |year, results| 
    = year 
    - results.each do |result| 
    = result.id 
    = result.data 
end 
संबंधित मुद्दे