2011-08-29 10 views
5

मैं वर्तमान में अपने रेल आवेदन के प्रशासन अनुभाग के लिए एक लॉग लागू करने की कोशिश कर रहा हूं। यह व्यवस्थापक को यह देखने की अनुमति देगा कि उपयोगकर्ता ने कौन सी कार्रवाइयां की हैं और कब। E.g 'उपयोगकर्ता ने एक नया पता जोड़ा', 'उपयोगकर्ता ने अपने पोस्टकोड को एक्स से वाई में अपडेट किया'।रेल में उपयोगकर्ता घटनाओं का लॉग रखें

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

class CreateLogs < ActiveRecord::Migration 
    def self.up 
    create_table :logs do |t| 
     t.integer :user_id 
     t.integer :marker_id 
     t.integer :administrator_id 
     t.integer :group_id 
     t.integer :assignment_id 
     t.integer :submission_id 
     t.integer :code 
     t.text :message 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :logs 
    end 
end 

मेरी चिंता का विषय है कि उदाहरण के लिए, यदि कोई उपयोगकर्ता (मान लें) कर सकता है उनके खाते में एक काम को जोड़ने है, यह

Log.create(:user_id => current_user.id, :assignment_id => the_assignment.id, :code => 342, :message => '') 

(कहीं कोड 342 'के लिए उपयोगकर्ता एक बनाया मेल खाती है के रूप में लॉग होता है नया पता ', इसलिए संदेश की कोई आवश्यकता नहीं है)

स्पष्ट रूप से लॉग व्यू में, मैं प्रासंगिक उपयोगकर्ता और पता जानकारी लॉग आईडी/विवरण से खींच सकता हूं लेकिन यदि यह उपयोगकर्ता या पता हटा दिया गया था, तो वह सारी जानकारी होगी अनुपलब्ध हो और लॉग के माध्यम से वापस देख रहे हैं, प्रविष्टि मूलभूत होगा वाई बेकार

इस तरह के लॉग सिस्टम घटनाओं में मदद करने और संभावित हटाने से निपटने के लिए पहले से ही एक बेहतर तरीका या कुछ बाहर होना चाहिए।

वैकल्पिक रूप से मैं पूरी प्रविष्टि को एक टेक्स्ट संदेश के रूप में संग्रहीत कर सकता हूं लेकिन क्या यह वास्तव में खराब नहीं होगा और डेटाबेस को अनावश्यक रूप से भर देगा?

मुझे बताएं कि इनमें से कोई अस्पष्ट नहीं है, बस यह पता लगाया गया है कि लॉगिंग एप्लिकेशन क्रियाएं/घटनाएं पहले की जानी चाहिए!

धन्यवाद,

पीट

उत्तर

3

ActiveRecord Versioning पर सूचीबद्ध जवाहरात पर एक नजर डालें, यह शायद तुम क्या जरूरत है।

+0

यह विशेष रूप से देखो पेपर ट्रेल की तरह वादा करता है, लेकिन यह केवल एक संस्करण/लॉग को सहेज सकता है जब कोई मॉडल सही हो जाता है? यदि मैं मैन्युअल रूप से प्रत्येक परिवर्तन को मैन्युअल रूप से निर्दिष्ट करना चाहता हूं तो क्या होगा? या यदि कोई कार्रवाई की जाती है जो आवश्यक रूप से मॉडल को बदलती नहीं है लेकिन कुछ और ईमेल भेजती है? –

+0

हां, संस्करण/ऑडिटिंग आमतौर पर केवल रिकॉर्ड परिवर्तनों से ट्रिगर होती है। यदि आपको कस्टम क्रियाओं को लॉग इन करने की आवश्यकता है जो डेटाबेस परिवर्तन को ट्रिगर नहीं करते हैं, तो आपको अपना खुद का लॉगर बनाना होगा। – eugen

1

मुझे लगता है कि आप आईडी (या इसके अलावा) आईडी के बजाय कच्चे पाठ का उपयोग करने के साथ एक अच्छे समाधान पर आते हैं। यदि आप उपयोगकर्ता नाम और पते संग्रहीत कर रहे हैं, तो शायद यह किसी भी स्टोरेज क्षमता को तोड़ने वाला नहीं है। यह बहुत अधिक है कि एक लॉग फ़ाइल कैसे करता है; यह बताता है कि किसने और कब हुआ। मुझे नहीं लगता कि यह टेक्स्ट में कुछ अतिरिक्त डेटा स्टोर करने के लिए आपके डीबी को बाधा पहुंचाएगा। यदि यह भारी हो गया, हालांकि, आप हमेशा पिछले कुछ हफ्तों के लॉग के रख-रखाव रख सकते थे। हो सकता है कि कुछ प्रकार की नौकरी हो जो 4 सप्ताह से अधिक पुरानी किसी भी लॉग फाइल को साफ़ करे। लेकिन यह ज्यादातर आपके काम करने के स्तर पर निर्भर करता है: यदि आप उपयोगकर्ता द्वारा किए जाने वाले प्रत्येक कार्य को लॉग कर रहे हैं, तो यह वास्तव में बड़ा हो जाता है। यदि आप केवल महत्वपूर्ण घटनाओं में रुचि रखते हैं (उपयोगकर्ता लॉग इन/आउट, बनाया/अपडेट/हटाया गया कुछ इत्यादि ...) तो मुझे लगता है कि आप पाठ को संग्रहित कर रहे हैं और थोड़ी देर में प्रत्येक बार सफाई कर रहे हैं।

संबंधित मुद्दे