2015-05-31 8 views
6

SQLite3 का उपयोग कर एक रेल एप्लिकेशन में मैं फ़्लोटिंग वैल्यू एट्रिब्यूट वाले मॉडल में फ्लोट वैल्यू Float::INFINITY और -Float::INFINITY का उपयोग करना चाहता हूं। INSERTModel.create! का उपयोग कर क्वेरी चल रहा है यह ठीक काम करता प्रतीत होता है, क्योंकि Activerecord इस मामले में तैयार बयान का उपयोग करता है। हालांकि, जब मैं एक रिकॉर्ड foo.save का उपयोग कर अद्यतन करने के लिए प्रयास करते हैं, ActiveRecord एक तैयार stament उपयोग नहीं करता है और सिर्फ सही क्वेरी में स्ट्रिंग Infinity डालता है,रेल पर रूबी में अनंत फ्लोट का उपयोग

SQLite3::SQLException: no such column: Infinity 

में जिसके परिणामस्वरूप इस को हल करने के लिए या करने के लिए एक रास्ता है मुझे मॉडल/डेटाबेस में तारों का उपयोग करने का सहारा लेना होगा?

रेल संस्करण 3.2.21, sqlite3 संस्करण 1.3.10


संपादित करें। अभी के लिए मैं डेटाबेस प्रवास में string लिए स्तंभ प्रकार बदल गया है और

serialize :property, Float 

का उपयोग डेटाबेस में YAML-धारावाहिक तैरता स्टोर करने के लिए ActiveRecord बताने के लिए, Float::INFINITY ठीक स्टोर करने के लिए अनुमति देता है।

उत्तर

0

ऐसा इसलिए है क्योंकि रेल में Float::INFINITY को 1.0/0 के रूप में परिभाषित किया गया है, कि sqlite3 को यह नहीं पता कि इसके साथ क्या किया जाए। आप डेटाबेस को

+1

नहीं, [IEEE754] (http://en.wikipedia.org/wiki/IEEE_floating_point) स्पष्ट रूप से उस मूल्य के प्रतिस्थापन के रूप में 9e999 जैसे अनंतता को परिभाषित करने के लिए बहुत बड़ी संख्या का उपयोग कर सकते हैं। + ∞ और -∞ नामक फ्लोट मान परिभाषित करता है। आपको इसे पीछे की ओर मिला, '1.0/0' को 'फ्लोट :: इन्फिनिटी' के रूप में परिभाषित किया गया है। '9e999' परिणामों में एक विशेषता को सेट करने के लिए 'फ़्लोट :: इन्फिनिटी' पर सेट किया जा रहा है, इसलिए मुझे एक ही SQLite3 त्रुटि मिलती है। – Christoph

+1

इसके बारे में क्षमा करें। मैं फ्लोट से परिचित नहीं हूं :) विचार सिर्फ अनंतता के प्रतिस्थापन के रूप में एक बहुत बड़ी संख्या का प्रयास करने के लिए है। वैसे भी, क्या आपने 'Float :: MAX' का उपयोग करने का प्रयास किया है? बस इसे खोज लिया और पता था कि इससे बड़ी संख्या रूबी में अनंतता के बराबर होती है। –

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