2010-07-27 13 views
22

में "update_at" कॉलम बंद करें मेरे पास एक साधारण "लॉग" मॉडल है, जो नियंत्रक की कार्रवाई को कॉल करने के तथ्य को रिकॉर्ड करता है।रेल

इस "लॉग" रिकॉर्ड की प्रविष्टियां एक बार बनाई जानी चाहिए और कभी नहीं बदला जा सकता है। इसके अलावा, मेरे पास डेटाबेस में इनमें से कई रिकॉर्ड होंगे।

तो, "अपडेटेड_एट" कॉलम की आवश्यकता नहीं है (एचडीडी पर मेमोरी बर्बाद करने की आवश्यकता नहीं है)।

मैं रेल को केवल "बनाया_at" कॉलम छोड़ने और "अपडेट_ट" का उपयोग न करने के लिए कैसे कह सकता हूं?

क्या "लॉग" मॉडल केवल पढ़ने के लिए कोई तरीका है?

उत्तर

17

आप मॉडल के लिए एक readonly? विधि जोड़कर केवल पढ़ने के लिए मॉडल बना सकते हैं।

class Log < ActiveRecord::Base 
    # Prevent modification of existing records 
    def readonly? 
     !new_record? 
    end 

    # Prevent objects from being destroyed 
    def before_destroy 
     raise ActiveRecord::ReadOnlyRecord 
    end 

end 

ऊपर दिया गया उदाहरण here से अपनाया गया था।

यदि आपको updated_at कॉलम की आवश्यकता नहीं है, तो बस इसे अपने डेटाबेस से हटाएं (या इसे न जोड़ें)। रेल अपडेट नहीं करेंगे जो वहां नहीं है।

+0

कूल, धन्यवाद। एक और बात - मैं रिकॉर्ड को नष्ट करने से कैसे रोक सकता हूं? "पठनीय" के साथ यह चाल उस के लिए काम नहीं करता है ... – AntonAL

+0

मैंने उदाहरण अपडेट किया। इसे एक ही लिंक से मिला। –

34

मुझे लगता है कि आपके पास updated_at कॉलम है क्योंकि आपने अपने मॉडल की माइग्रेशन फ़ाइल में t.timestamps शॉर्टंड का उपयोग किया था। आप स्तंभ नहीं करना चाहते हैं तो आप निर्दिष्ट कर सकते हैं क्या आप स्पष्ट रूप से चाहते हैं:

class Log < ActiveRecord::Migration 
    def self.up 
    create_table :logs do |t| 
     t.column :foo,  :string 
     t.column :created_at, :datetime 
    end 
    end 

    def self.down 
    drop_table :logs 
    end 
end 
+0

जॉन, यह एक मान्य समाधान है? क्या आपने इसका इस्तेमाल किया? – Hamdan

+1

मेरा उत्तर उस समय सही था जब मैंने इसे पोस्ट किया था। –

+0

अच्छा समाधान। यदि स्तंभ मौजूद है तो बनाया गया_at को अद्यतन करने के लिए रेल पर्याप्त समझदार है। –