कॉल को केवल तभी चलाएं जब कोई विशेषता रेल में बदल गई हो


100

मेरे ऐप में निम्नलिखित संघ हैं:

# Page 
belongs_to :status

मैं एक कॉलबैक कभी भी चलाना चाहते हैं status_idएक का pageबदल गया है।

इसलिए, अगर page.status_id4 से 5 तक जाता है , तो मैं इसे पकड़ना चाहता हूं।

ऐसा कैसे करें?

जवाबों:


209

रेल 5.1+

class Page < ActiveRecord::Base
  before_save :do_something, if: :will_save_change_to_status_id?

  private

  def do_something
    # ...
  end
end

ActiveRecord को बदलने वाली प्रतिबद्धता :: गंदा यहाँ है: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b6a3c81

इन परिवर्तनों पर एक ब्लॉग पोस्ट यहाँ दी गई है: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html

यहाँ मैं सारांश है जो ActiveRecord में परिवर्तन के लिए खुद के लिए बनाया गया है :: रेल में गंदे 5.1+

ActiveRecord :: गंदा

https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html

सहेजने से पहले (वैकल्पिक परिवर्तन)

किसी ऑब्जेक्ट को संशोधित करने के बाद और डेटाबेस में या before_saveफ़िल्टर के भीतर सहेजने से पहले :

  • changes अब होना चाहिए changes_to_save
  • changed? अब होना चाहिए has_changes_to_save?
  • changed अब होना चाहिए changed_attribute_names_to_save
  • <attribute>_change अब होना चाहिए <attribute>_change_to_be_saved
  • <attribute>_changed? अब होना चाहिए will_save_change_to_<attribute>?
  • <attribute>_was अब होना चाहिए <attribute>_in_database

सहेजने के बाद (ब्रेकिंग चेंज)

किसी ऑब्जेक्ट को संशोधित करने और डेटाबेस में सहेजने के बाद, या after_saveफ़िल्टर के भीतर :

  • saved_changes(जगह previous_changes)
  • saved_changes?
  • saved_change_to_<attribute>
  • saved_change_to_<attribute>?
  • <attribute>_before_last_save

रेल्स <= 5.0

class Page < ActiveRecord::Base
  before_save :do_something, if: :status_id_changed?

  private

  def do_something
    # ...
  end
end

यह इस तथ्य का उपयोग करता है कि before_saveकॉलबैक एक विधि कॉल के वापसी मूल्य के आधार पर सशर्त निष्पादित कर सकता है। यह status_id_changed?विधि ActiveModel :: डर्टी से आती है , जो हमें यह जांचने की अनुमति देती है कि क्या किसी विशिष्ट विशेषता को केवल _changed?विशेषता नाम में जोड़कर बदल दिया गया है ।

जब do_somethingविधि को बुलाया जाना चाहिए तो आपकी आवश्यकताओं पर निर्भर होगा। यह या सक्रिय ActiveRecord :: Callbacks में से कोई भी before_saveया हो सकता है ।after_save


4
इस समाधान को नए संस्करणों में पदावनत किया गया है।
मेटुस लुइज़

6
रेल के साथ अद्यतन 5.1+ जानकारी।
pdobb


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.