2010-12-27 18 views
15

पहले कोड:रेल डेटाबेस बूलियन मूल्यों

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 के लिए मूल्य वर्तमान डेटाबेस कनेक्शन के आधार पर बदलने की जरूरत ...

यह और भी संभव है?

+0

के लिए SQL सर्वर या MySQL, और 'टी' के लिए क्यों आप MySQL के साथ स्थानीय स्तर पर विकसित नहीं है? इससे अन्य असंगतताओं के साथ-साथ इस समस्या को हल किया जाएगा। जिस तरह से मैं आमतौर पर बुलियन के साथ सौदा करता हूं वह तैयार कथन का उपयोग करना है, लेकिन आपके लिए काम नहीं करेगा। –

+0

हालांकि यह मेरे प्रश्न का उत्तर नहीं देता है। अगर मैं कुछ बिंदु पर POSTgres या MSSQL का उपयोग करना चाहता हूं तो क्या होगा? – sethvargo

उत्तर

31

मेरा मानना ​​है कि आप ActiveRecord::Base.connection.quoted_true

के लिए यह उद्धरण है, उदा देशी बूलियन मूल्यों रिटर्न की तलाश में जा सकता है कि '1' PostgreSQL या SQLite

+0

आपको बहुत बहुत धन्यवाद! आपको यह कैसे मिला/कहाँ मिला ?! साथ ही, यह आपके उत्तर को संपादित करने के लायक हो सकता है (केवल उन लोगों के लिए जिनके पास यह समस्या हो सकती है) यह उल्लेख करने के लिए कि इसमें स्वचालित रूप से उद्धरण (') शामिल हैं। उदाहरण के लिए, यदि कनेक्शन स्क्लाइट है, तो यह केवल टी नहीं 'टी' देता है। – sethvargo

+2

हे, इसे खोजने के लिए, मुझे ActiveRecord कनेक्शन एडेप्टर के कोडों को देखकर कुछ मज़ा आया। – Scott

+1

बस स्पष्टता के लिए: आप वर्ग विधियों में self.connection.quoted_ * का उपयोग कर सकते हैं और self.class.connection.quoted_ * उदाहरण विधियों में। –

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