6

में कस्टम प्राथमिक कुंजी सेट करने में समस्याएं मैं postgresql 9.3, रूबी 2.0, रेल 4.0.0 का उपयोग करता हूं।रेल 4 माइग्रेशन

अतः एक मेज पर प्राथमिक कुंजी स्थापित करने के बारे में पर कई सवाल पढ़ने के बाद, मैं उत्पन्न होती है और निम्न माइग्रेशन कहा:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, { id: false, primary_key: :uid } do |t| 
     t.integer :uid, limit: 8 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end 
    end 
end 

मैं भी अपने मॉडल को self.primary_key = "uid" गयी।

माइग्रेशन सफलतापूर्वक चलता है, लेकिन जब मैं डीजी से कनेक्ट करता हूं तो pgAdmin III का उपयोग करके मैं देखता हूं कि यूआईडी कॉलम प्राथमिक कुंजी के रूप में सेट नहीं है। मैं क्या खो रहा हूँ?

उत्तर

17

this answer पर एक नज़र डालें। Create_table ब्लॉक में primary_key पैरामीटर निर्दिष्ट किए बिना execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" पर आज़माएं।

मैं इस तरह आपका माइग्रेशन लिखने के लिए सुझाव देते हैं (ताकि आप सामान्य रूप से रोलबैक सकता है):

class CreateShareholders < ActiveRecord::Migration 
    def up 
    create_table :shareholders, id: false do |t| 
     t.integer :uid, limit: 8 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end 
    execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" 
    end 

    def down 
    drop_table :shareholders 
    end 
end 

युपीडी: प्राकृतिक तरीके से (found here) नहीं है, लेकिन केवल int4 प्रकार के साथ:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, id: false do |t| 
     t.primary_key :uid 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end  
    end 
end 
+0

है कि मैं वास्तव में क्या सवाल में लिखने के लिए याद किया। जबकि मैं ऐसा करने में सक्षम था, मैं जानना चाहता हूं कि "प्राकृतिक" तरीके से इसे हासिल करने का कोई तरीका है, जो सीधे एसक्यूएल प्रश्नों को निष्पादित किए बिना है। फिर भी, चूंकि कोई अन्य सुझाव नहीं है, इसलिए मैं इसे सबसे अच्छे उत्तर के रूप में स्वीकार करता हूं। :) –

+0

मुझे लगता है कि मुझे प्राकृतिक तरीका मिला है। कृपया अद्यतन देखें। – peresleguine

+0

लेकिन इस मामले में प्राथमिक कुंजी का प्रकार क्या है? मुझे इसे बड़ा होना चाहिए। –

0

मेरे पर्यावरण में (activerecord 3.2.19 और पोस्टग्रेस 9.3.1),

:id => true, :primary_key => "columname" 

एक प्राथमिक कुंजी सफलतापूर्वक बनाता है लेकिन निर्दिष्ट करने के बजाय ": सीमा => 8" कॉलम का प्रकार int4 है!

create_table :m_check_pattern, :primary_key => "checkpatternid" do |t| 
    t.integer  :checkpatternid, :limit => 8, :null => false 
end 

अपूर्ण जानकारी के लिए खेद है।

0

इस तरह मैं पैदा की है माइग्रेशन:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, id: false do |t| 
     t.integer :uid, primary_key: true 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end  
    end 
end 
संबंधित मुद्दे