यह अच्छी तरह से प्रलेखित नहीं है, लेकिन आप एक लैम्ब्डा को एक माइग्रेशन में डिफ़ॉल्ट मान के रूप में आपूर्ति कर सकते हैं और यह द राइट थिंग करेगा। अगर आप यह कहते हैं:
def change
change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end
तब कॉलम का डिफ़ॉल्ट मान now()
. पर सेट हो जाएगा और डेटाबेस फ़ंक्शन now()
कॉलम के लिए डिफ़ॉल्ट मान की आवश्यकता होने तक कॉल नहीं किया जाएगा। फिर अगर आप \d stratum_worker_submissions
psql
. में आप देखेंगे:
created_at | timestamp without time zone | not null default now()
जैसी इच्छा। जब माइग्रेशन चलता है तो किसी भी अन्य डिफ़ॉल्ट का मूल्यांकन किया जाएगा और आपको डिफ़ॉल्ट के रूप में एक निश्चित टाइमस्टैम्प मिलेगा।
वैकल्पिक रूप से, आप इसे हमेशा SQL का उपयोग करके हाथ से कर सकते हैं:
def up
connection.execute(%q(
alter table stratum_worker_submissions
alter column created_at
set default now()
))
end
def down
connection.execute(%q(
alter table stratum_worker_submissions
alter column created_at
drop default
))
end
ध्यान दें कि यदि आप SQL के साथ मैन्युअल रूप से स्कीमा बदलना शुरू करते हैं तो आप ऐसे काम करना शुरू कर सकते हैं जो db/schema.rb
में दिखाई नहीं देंगे। जैसा कि आप जल्दी से SQL में जा सकते हैं कि ActiveRecord समझ में नहीं आता है। अगर ऐसा होता है तो आप db/schema.rb
. से बदल सकते हैं करने के लिए db/structure.sql
config/application.rb
. को बदलकर :
config.active_record.schema_format = :sql
और फिर db/schema.rb
. की जगह db/structure.sql
. के साथ संशोधन नियंत्रण में और db:structure
. का उपयोग करके सामान्य db:schema
. के स्थान पर रेक कार्य कार्य।