ALTER के यूजिंग क्लॉज का उपयोग करके आप इसे एक बार में आसानी से कर सकते हैं। टेबल :
एक साधारण एसक्यूएल टाइप कास्ट आपको स्ट्रिंग्स के साथ छोड़ देगा 'true' और 'false' तो आप एक USING जोड़ना चाहते हैं। मैं AR को बायपास करके हाथ से करूँगा:
connection.execute(%q(
alter table users
alter column active
type text
using case when active then 'active' else 'inactive' end
))
आपके लिए महत्वपूर्ण हिस्सा है using case ... अंत में भाग। आप सामान्य AR-ish change_column . के साथ इसका उपयोग कर सकते हैं सही काम करने के लिए AR को धोखा देकर सामान:
class ChangeColumnTypeInUsers < ActiveRecord::Migration
def up
change_column :users, :active, "text using case when active then 'active' else 'inactive' end"
end
def down
change_column :users, :active, "boolean using active = 'active'"
end
end
ध्यान दें कि मैं text का उपयोग कर रहा हूं स्तंभ प्रकार के रूप में। रेल varchar(255) . का प्रयोग करेंगे डेटाबेस के अंदर जब आप कहते हैं :string एक सीमा के बिना, PostgreSQL के साथ यह बहुत ही व्यर्थ है क्योंकि यह सभी स्ट्रिंग प्रकारों के लिए भंडारण को संभालता है काफी समान आंतरिक रूप से
, char(n) . पर लंबाई प्रतिबंध और varchar(n) वास्तव में उन्हें text . की तुलना में उपयोग करने के लिए अधिक महंगा बनाते हैं . तब केवल समय :string PostgreSQL के साथ समझ में आता है जब आपके पास एक विशिष्ट :limit . शामिल करने का कोई कारण होता है (और फिर एक text CHECK के साथ कॉलम लंबाई पर बाधा अधिक समझ में आती है लेकिन एआर "उन्नत" चीजों जैसे CHECK के बारे में जानने के लिए बहुत गूंगा है बाधाएं)।