मैं अपने रेल एप्लिकेशन (3.2.3) में विरासत डेटाबेस माइग्रेट करने पर काम कर रहा हूं। मूल डेटाबेस रिपोर्ट के लिए काफी लंबे एसक्यूएल प्रश्नों के साथ आता है। अभी के लिए, मैं इसे रेल एप्लिकेशन में एसक्यूएल प्रश्नों का उपयोग करना चाहता हूं और फिर एक-एक करके (जब समय की अनुमति देता है) एसक्यूएल प्रश्नों को 'उचित' रेल प्रश्नों के लिए स्वैप करें।रेल 3 आवेदन में कच्चे एसक्यूएल प्रश्नों का उपयोग करना?
मैं एक नैदानिक मॉडल है और नियंत्रक निम्नलिखित कोड है:
@clinical_income_by_year = Clinical.find_all_by_sql(SELECT date_format(c.transactiondate,'%Y') as Year,
date_format(c.transactiondate,'%b') as Month,
sum(c.LineBalance) as "Income"
FROM clinical c
WHERE c.Payments = 0 AND c.LineBalance <> 0
AND c.analysiscode <> 213
GROUP BY c.MonthYear;)
हालांकि, जब मुझे लगता है कि कोड को चलाने मैं कुछ त्रुटियों स्वरूपण के साथ क्या करना मिलता है।
Started GET "/clinicals" for 127.0.0.1 at 2012-04-29 18:00:45 +0100
SyntaxError (/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:6: syntax error, unexpected tIDENTIFIER, expecting ')'
...rmat(c.transactiondate,'%Y') as Year,
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:7: syntax error, unexpected tIDENTIFIER, expecting keyword_end
...rmat(c.transactiondate,'%b') as Month,
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:8: syntax error, unexpected tIDENTIFIER, expecting keyword_end
... sum(c.LineBalance) as "Income"
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:10: syntax error, unexpected tCONSTANT, expecting keyword_end
... WHERE c.Payments = 0 AND c.LineBalance <> 0
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:10: syntax error, unexpected '>'
...yments = 0 AND c.LineBalance <> 0
... ^
/Users/dannymcclelland/Projects/premvet/app/controllers/clinicals_controller.rb:11: syntax error, unexpected '>'
... AND c.analysiscode <> 213
... ^
क्या मुझे नियंत्रक में आयात करने से पहले एसक्यूएल क्वेरी में कुछ करना चाहिए? यद्यपि यह संभव है कि क्वेरी में कुछ गड़बड़ है (यह कुछ समय पहले लिखा गया था), यह डेटाबेस के भीतर सीधे चलाए जाने पर अपेक्षित काम करता है। यह इस प्रकार एक सरणी देता है:
----------------------------------------------
| Year | Month | Income |
----------------------------------------------
----------------------------------------------
| 2012 | January | 20,000 |
| 2012 | February | 20,000 |
| 2012 | March | 20,000 |
| 2012 | April | 20,000 |
----------------------------------------------
etc..
कोई भी मदद, सलाह या सामान्य पॉइंटर्स की सराहना की जाएगी!
मैं एक सही रेल क्वेरी के लिए एसक्यूएल जिज्ञासा को बदलने की कोशिश कर रहा http://guides.rubyonrails.org/active_record_querying.html के माध्यम से पढ़ रहा हूँ।
अब तक मैं अंतिम पंक्ति से पीछे नहीं मिलते-जुलते होते:
AND c.analysiscode <> 213
बच्चे चरणों के साथ
@clinical_income_by_year = Clinical.where("AnalysisCode != 213")
!
अद्यतन
मैं छानने मिल गया है अब हल कर, रेल गाइड साइट के लिए धन्यवाद, लेकिन मैं एसक्यूएल क्वेरी का समूह और योग ओर से अटक कर रहा हूँ। मैं अब तक निम्नलिखित है:
@clinical_income_by_year = Clinical.where("AnalysisCode != 213 AND Payments != 0 AND LineBalance != 0").page(params[:page]).per_page(15)
मैं एसक्यूएल क्वेरी के निम्नांकित दो पंक्तियों में निर्माण करने के लिए संघर्ष कर रहा हूँ:
sum(c.LineBalance) as "Income"
और
GROUP BY c.MonthYear;)
मेरा विचार कोड की तरह दिखता है यह:
<% @clinical_income_by_year.each do |clinical| %>
<tr>
<td><%= clinical.TransactionDate.strftime("%Y") %></td>
<td><%= clinical.TransactionDate.strftime("%B") %></td>
<td><%= Clinical.sum(:LineBalance) %></td>
</tr>
<% end %>
</table>
<%= will_paginate @clinical_income_by_year %>
जैसा कि मैंने एसक्यूएल क्वेरी को रेल क्वेरी में परिवर्तित करने के मार्ग को शुरू कर दिया है, क्या आप जारी रखने की सिफारिश करेंगे या एसक्यूएल प्रश्नों का उपयोग मॉडल और नियंत्रकों के भीतर एक आम बात का उपयोग कर रहे हैं? – dannymcc
@dannymcc: रेल पद्धतियों का उपयोग आमतौर पर अनुशंसित किया जाता है लेकिन कभी-कभी एसक्यूएल आवश्यक होता है, यदि आपने "उन्नत" डेटाबेस सुविधाओं जैसे संग्रहीत प्रक्रियाओं, विंडो फ़ंक्शंस, व्युत्पन्न तालिकाओं, सीटीई इत्यादि का उपयोग किया है तो आपको बहुत सारे कच्चे लिखना होगा काम पूरा करने के लिए एसक्यूएल; यदि आपके सभी प्रश्न सरल हैं 'टी 1 से चुनें * जहां ...' प्रश्न तो आप ActiveRecord विधियों का उपयोग कर शायद बेहतर हो। यह एक निर्णय कॉल है, जो भी आप के लिए स्पष्ट है और आपके कोड को बनाए रखने वाले लोगों का उपयोग करें। –
मुझे लगता है कि उन्हें पढ़ने के दौरान ActiveRecord विधियों का उपयोग करना मेरे लिए स्पष्ट है, लेकिन उन्हें लिखना मेरे लिए कच्चे एसक्यूएल प्रश्न लिखने जैसा जटिल है! सलाह के लिए धन्यवाद। – dannymcc