पहले कोड:रेल डेटाबेस बूलियन मूल्यों
create_table :users do |t|
...
t.boolean :is_active, :default => true
...
end
अब, यहाँ मेरी समस्या है - मैं रिकॉर्ड की एक बड़ी संख्या आयात करने के लिए एक रेक कार्य बनाने हूँ (10,000+)। मैंने व्यापक परीक्षण और बेंचमार्किंग किया है और यह निर्धारित किया है कि इस कार्य को करने का सबसे तेज़ और सबसे प्रभावी तरीका एक विशाल कच्चा SQL कथन बनाना है। (मैं सीएसवी से डेटा पढ़ रहा हूँ)। एक उदाहरण के रूप:
inserts = Array.new
FasterCSV.foreach(...) do |row|
inserts.push "(row[0], row[1]...)"
end
User.connection.execute "INSERT INTO users (...) VALUES #{inserts.join(", ")}"
सब कुछ अच्छा काम करता है। संपूर्ण प्रक्रिया ActiveRecord का उपयोग कर 1.5 घंटे के बजाय (शाब्दिक) सेकंड में पूर्ण होती है। हालांकि, मेरी समस्या बूलियन क्षेत्र के साथ निहित है। मैं स्थानीय रूप से SQLite पर विकसित करता हूं, लेकिन उत्पादन पर MySQL। ActiveRecord का उपयोग करते समय, रेल निर्धारित करता है कि "बूलियन" फ़ील्ड में क्या रखा जाए (क्योंकि लगभग सभी डेटाबेस अलग हैं)। मैं कस्टम एसक्यूएल लिख रहा हूँ और मैं अगर वहाँ एक तरह से मैं कुछ की तरह कर सकते हैं जानना चाहता हूँ ...
INSERT INTO users(..., is_active, ...) VALUES (..., ActiveRecord::Base.connection.boolean.true, ...)
... जो सही तरीके से डेटाबेस विशेष बूलियन मान देता है।
जो कोई जवाब देती है "बस ActiveRecord का उपयोग कर" नीचे मतदान किया जाएगा। यह इस स्थिति में बस संभव नहीं है। मैं एक छोटे से (1) क्षेत्र का उपयोग करने के लिए भी तैयार नहीं हूं और 1 या 0 का उपयोग करता हूं।
सारांश में, is_active
के लिए मूल्य वर्तमान डेटाबेस कनेक्शन के आधार पर बदलने की जरूरत ...
यह और भी संभव है?
के लिए SQL सर्वर या MySQL, और 'टी' के लिए क्यों आप MySQL के साथ स्थानीय स्तर पर विकसित नहीं है? इससे अन्य असंगतताओं के साथ-साथ इस समस्या को हल किया जाएगा। जिस तरह से मैं आमतौर पर बुलियन के साथ सौदा करता हूं वह तैयार कथन का उपयोग करना है, लेकिन आपके लिए काम नहीं करेगा। –
हालांकि यह मेरे प्रश्न का उत्तर नहीं देता है। अगर मैं कुछ बिंदु पर POSTgres या MSSQL का उपयोग करना चाहता हूं तो क्या होगा? – sethvargo