2010-12-22 19 views
59

मैंने अपनी तालिका में एक नया कॉलम जोड़ा लेकिन मैं डिफ़ॉल्ट विकल्प जोड़ना भूल गया। अब मैं हर पंक्ति पर उस कॉलम को पॉप्युलेट करना चाहता हूं।एक कॉलम अपडेट करें, सभी पंक्तियां

क्या कंसोल का उपयोग करने का कोई तरीका है? मैं पिछले घंटे के लिए Google खोज रहा हूं लेकिन मुझे कुछ भी नहीं मिला।

मुझे पता है कि एक वस्तु के लिए इसे कैसे करना है, लेकिन सभी के लिए मॉडल में नहीं। Foo.find (1) .update_attribute (: myattribute, 'मान')

+0

क्या आप प्रत्येक पंक्ति के लिए प्रत्येक पंक्ति या अलग के लिए समान मान असाइन करना चाहते हैं? –

+0

सभी के लिए एक ही मूल्य। धन्यवाद –

+0

ठीक है, @petrov। आप update_all विधि –

उत्तर

116

इस प्रयास करें:

Foo.update_all(some_column: "bar") 

इस डेटाबेस के लिए SQL क्वेरी उत्पन्न करेगा:

UPDATE "foos" SET "some_column" = "bar"; 
+0

धन्यवाद कर सकते हैं धन्यवाद आप pake007। यह काम। शुरुआत में मैंने ModelName.update को आजमाया लेकिन यह –

+4

काम नहीं किया @Petrov, और भी अधिक, आप इस विधि के लिए एक शर्त param को पारित कर सकते हैं। जैसे: Foo.update_all ({: new_column => "bar"}, {: old_column_1 => nil})। यह उन सभी रिकॉर्ड्स को अपडेट करेगा जिनके पास 'old_column_1' कॉलम पर शून्य मान है। –

+0

लेकिन रेल 2.2 के लिए? क्या वाक्यविन्यास का उपयोग करें? – harsh4u

22

के बाद से पहले से बनाई पिछले माइग्रेशन में नया फ़ील्ड, एक नया नया माइग्रेशन बनाएं:

rails g migration UpdateFoos 

मोदी माइग्रेशन:

def self.up  
    say_with_time "Updating foos..." do 
    Foo.find(:all).each do |f| 
     f.update_attribute :myattribute, 'value' 
    end 
    end 
end 

# from command line 
Rake db:migrate 

मुझे बताएं कि यह काम करता है, तो इसे कुछ समायोजन की आवश्यकता हो सकती है। अधिक के लिए रेल docs देखें:

+0

यह अच्छा दृष्टिकोण होगा! – Zabba

+4

ग्रेट उत्तर। Rails3 लोग, उपरोक्त उदाहरण में Foo.find (: all) के बजाय Foo.all का उपयोग करें। – Phantomwhale

+1

यह हैकोकू पर होस्टिंग ऐप्स के लिए अच्छा है :) – matma

3

आप इस तरह कर सकते हैं:

Foo.update_all (new_column: "बार")

2
बेशक आप Foo.update_all(:myattribute => "value") तरह ख़ाली उपयोग कर सकते हैं के

, लेकिन यह ' केवल पहले ही बनाए गए डेटा को संशोधित करेगा। इस तरह

rails generate migration AddDefaultValueToFoo 

नया माइग्रेशन संशोधित (पूर्व के लिए myattribute एक स्ट्रिंग प्रकार है।):

class AddDefaultValueToFoo < ActiveRecord::Migration 
    def self.up 
    change_column :foos, :myattribute, :string, :default => "value" 
    Foo.update_all(:myattribute => "value") 
    end 
end 
सभी "भविष्य" डेटा के लिए डिफ़ॉल्ट मान सेट करने के लिए यह एक अच्छा तरीका एक अलग इस तरह पलायन बनाने के लिए
संबंधित मुद्दे