2011-08-11 6 views
28

मुझे 0 से 3 तक फ़ील्ड का डिफ़ॉल्ट मान बदलने की ज़रूरत है, लेकिन पकड़ है कि मेरे पास पहले से ही हजारों रिकॉर्ड्स हैं और उन रिकॉर्ड्स को मान को 3 से 0 में बदलना है, यदि रिकॉर्ड में डिफ़ॉल्ट मान 0 है लेकिन दूसरे के लिए 1, 2 जैसे मूल्यों को वही रहना चाहिए। मैं यह कैसे कर सकता हूं? अपने कॉलमकिसी फ़ील्ड के लिए डिफ़ॉल्ट मान बदलने के लिए माइग्रेशन और सभी मौजूदा रिकॉर्ड के मान को नए डिफ़ॉल्ट मान में बदल दें, अगर उसके पास पुराना डिफ़ॉल्ट मान हो।

+5

क्या आप बस 'सेट एसईटी मूल्य = 3 कहां मूल्य = 0' अपडेट नहीं कर सकते? – Pelshoff

उत्तर

74

प्रवास आप विधि का उपयोग करना चाहिए में होना करने के लिए स्तंभ मजबूर संभालने है इस तरह की तालिका सेटिंग्स को बदलने के लिए change_column:

change_column :my_models, :attribute_name, :integer, :default => 3 

और फिर बजाय सभी रिकॉर्ड के माध्यम से पाशन और उन्हें अद्यतन करने को व्यक्तिगत रूप से आप विधि का उपयोग update_all यह पसंद कर सकता है की सभी मौजूदा रिकॉर्ड अद्यतन करने के लिए,:

MyModel.update_all({ :attribute_name => 3 }, { :attribute_name => 0 }) 

पहला तर्क विधि बताता है कि क्या मान सेट करने के लिए और दूसरा कहता है यह शर्त है कि किस पंक्तियों को अद्यतन करना है।

+0

अच्छा और साफ, मुझे इस बारे में पता नहीं था ... –

+0

मुझे आश्चर्य है कि यह केवल कुछ डेटाबेस पर काम कर सकता है क्योंकि मुझे यकीन नहीं है कि सभी डिफ़ॉल्ट मान को बदलने की अनुमति देंगे। वैसे भी, मैं पुष्टि कर सकता हूं कि यह MySQL पर काम करता है। – mahemoff

+1

मैंने अभी यह कोशिश की, और मुझे लगता है कि वाक्यविन्यास बदल गया होगा। यह मेरे लिए काम करता है: 'MyModel.update_all ({: attribute_name => 3}, {: attribute_name => 0}) ' – AlexBrand

2
ALTER TABLE your_table MODIFY your_column tinyint(1) NOT NULL DEFAULT 3; 
UPDATE your_table SET your_column=3 WHERE your_column=0; 
  1. संभालने tinyint(1) है, अपने आप को बदलने नहीं तो एक ही
  2. NOT NULL आप हमेशा NOT NULl
संबंधित मुद्दे