ruby on rails - यह निर्धारित करने के लिए कि क्या रिकॉर्ड अभी बनाया गया है या बाद में सहेजा गया है




ruby-on-rails activerecord (4)

#new_record? फ़ंक्शन निर्धारित करता है कि कोई रिकॉर्ड सहेजा गया है या नहीं। लेकिन यह हमेशा के after_save हुक में झूठा है। क्या यह निर्धारित करने का कोई तरीका है कि रिकॉर्ड एक नया बनाया गया रिकॉर्ड है या अद्यतन से पुराना है?

मैं आशा करता before_create कि मॉडल में ध्वज सेट करने के लिए before_create जैसे किसी अन्य कॉलबैक का उपयोग न करें या डीबी में दूसरी क्वेरी की आवश्यकता हो।

किसी भी सलाह की सराहना की है।

संपादित करें: इसे बाद में हुक में निर्धारित करने की आवश्यकता है, और मेरे विशेष उपयोग के मामले में, कोई updated_at या updated_on टाइमस्टैंप नहीं है


एक बाद की कॉलबैक है जिसे केवल सहेजा जाने के बाद रिकॉर्ड ही एक नया रिकॉर्ड है या नहीं । उपयोग के लिए एक after_update कॉलबैक भी है यदि यह एक मौजूदा रिकॉर्ड था जिसे बदला और सहेजा गया था। after_save या after_update जाने के बाद, दोनों मामलों में after_save कॉलबैक को बुलाया जाता है।

नए रिकॉर्ड को सहेजने के बाद आपको कुछ होने की आवश्यकता होने पर बाद में उपयोग करें।

यहां अधिक जानकारी: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html


चूंकि ऑब्जेक्ट पहले से ही सहेजा जा चुका है, इसलिए आपको पिछले परिवर्तनों को देखने की आवश्यकता होगी। आईडी केवल एक निर्माण के बाद बदलना चाहिए।

# true if this is a new record
@object.previous_changes[:id].any?

एक इंस्टेंस वैरिएबल @new_record_before_save । आप इसे निम्नलिखित करके एक्सेस कर सकते हैं:

# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)

दोनों बहुत बदसूरत हैं, लेकिन वे आपको यह जानने की अनुमति देंगे कि वस्तु को नव निर्मित किया गया है या नहीं। उम्मीद है की वो मदद करदे!


मैं इसे after_save कॉलबैक के लिए उपयोग करने के लिए देख रहा था।

id_changed? का उपयोग करना एक आसान समाधान है id_changed? (चूंकि यह update पर नहीं बदलेगा) या यहां तक ​​कि created_at_changed? भी created_at_changed? यदि टाइमस्टैम्प कॉलम मौजूद हैं।

अपडेट करें: जैसा कि @ मिट्टी बताता है, अगर कॉलबैक के बाहर इस चेक की आवश्यकता है तो id_previously_changed? उपयोग id_previously_changed?docs देखें।


यहां कोई रेल जादू नहीं है जिसे मैं जानता हूं, आपको इसे स्वयं करना होगा। आप वर्चुअल विशेषता का उपयोग करके इसे साफ़ कर सकते हैं ...

आपके मॉडल वर्ग में:

def before_save
  @was_a_new_record = new_record?
  return true
end

def after_save
  if @was_a_new_record
    ...
  end
end






activemodel