2015-10-25 13 views
6

मुझे बाहरी रूप से सोर्स आईडी का उपयोग करके उपयोगकर्ताओं की एक तालिका को अनुक्रमणित करने की आवश्यकता है, जो एक 64-बिट पूर्णांक है। रेल इतनी संख्या को संग्रहित करने में पूरी तरह से सक्षम है, जब तक कि यह प्राथमिक कुंजी दिखाई न दे। मैं निम्न माइग्रेशन है:पूर्णांक सीमा को अनदेखा करते हुए रेल पर रूबी

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users, :id => false do |t| 
     t.integer :id, limit: 8 
     t.string :name 

     t.timestamps null: false 
    end 
    end 
end 

प्रवास ठीक काम करता है, कोई त्रुटि की सूचना दी, लेकिन जब मैं एक 64-बिट पूर्णांक के साथ बीज के प्रयास, मैं इस से दूर बताया हूँ:

RangeError: 76561198054432981 is out of range for ActiveRecord::Type::Integer with limit 4 

स्पष्ट रूप से रेल सीमा क्षेत्र को अनदेखा कर रहे हैं, जब तक यह प्राथमिक कुंजी/आईडी फ़ील्ड है? मुझे इससे निपटने के लिए कैसे जाना चाहिए?

इसके लायक होने के लिए मैं sqlite3 (डिफ़ॉल्ट) का उपयोग कर रहा हूं, लेकिन मेरे ज्ञान के लिए, एसक्लाइट 64-बिट पूर्णांक को संग्रहीत करने में पूरी तरह से सक्षम है।

यहाँ SQLite से table_info है:

0|id|integer(8)|0||0 
1|name|varchar|0||0 
2|created_at|datetime|1||0 
3|updated_at|datetime|1||0 
+1

आप यकीन है कि यह एक SQLite मुद्दा नहीं है कर रहे हैं SQLite के कोड बेस में की वजह से

enter image description here


हालांकि संभव है? http://jakegoulding.com/blog/2011/02/06/sqlite-64-bit-integers/ –

+0

@ क्रिस्टियानोबेटा मुझे विश्वास नहीं है, मैंने एक ही नाम के साथ एक ही कॉलम के साथ एक और कॉलम जोड़ने का प्रयास किया जो ठीक काम करता था । Pragma table_info के अनुसार दोनों को उसी तरह परिभाषित किया गया है। – Will

+0

मेरे पास PostgreSQL पर एक समान समस्या है। डेटाबेस बताता है कि कॉलम 'bigint' है और कॉलम मेटाडाटा 8 की सीमा बताता है, लेकिन मुझे सक्रिय मॉडेल :: टाइप :: इंटीजर के लिए सीमा 4' –

उत्तर

3

सीमा मूल्य आप दे दी है सही है; यह BIGINT प्रकार enter image description here से मेल खाता है सुनिश्चित करें कि आपका माइग्रेशन लागू है; कुछ CLI या GUI सॉफ्टवेयर में आप डेटाबेस को खोलने और सत्यापित करें col-प्रकार

अलावा: एक प्रवास में एक स्तंभ की लंबाई या डेटाप्रकार परिवर्तन करने से एक प्राथमिक कुंजी के रूप स्तंभ अमान्य हो जाएगा। बल्कि, एक प्रारंभकर्ता ओवरराइड करता है कि साइट के डिफ़ॉल्ट प्राथमिक कुंजी डेटाप्रकार आप लागू करने के लिए देख रहे हैं व्यवहार प्रदान करना चाहिए बनाने:

# config/initializers/change_primary_key_datatype.rb 
require 'active_record/connection_adapters/postgresql_adapter' 
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "bigserial primary key" 

यह हम PG डेटाबेस के लिए क्या करेंगे है; यह है

enter image description here

+1

के साथ सीमा के बाहर त्रुटि मिली है, मैंने डेटाबेस हटा दिया, भाग गया माइग्रेशन, इसे बीजिंग करने की कोशिश की, और त्रुटि बनी हुई है। sqlite सही और अपेक्षित दिखाता है: सीमा। – Will

+0

तो प्राथमिक कुंजी के आकार को बदलने के लिए कोई ड्राइवर-अज्ञेय तरीका नहीं है? – Will

+0

पाठ के स्क्रीन शॉट्स को क्यों शामिल किया जा सकता है जब आप टेक्स्ट में पेस्ट कर सकते थे (और [प्रलेखन] से जुड़े थे (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html)) कम प्रयास के साथ? –

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