मेरे ऐप में निम्नलिखित संघ हैं:
# Page
belongs_to :status
मैं एक कॉलबैक कभी भी चलाना चाहते हैं status_id
एक का page
बदल गया है।
इसलिए, अगर page.status_id
4 से 5 तक जाता है , तो मैं इसे पकड़ना चाहता हूं।
ऐसा कैसे करें?
मेरे ऐप में निम्नलिखित संघ हैं:
# Page
belongs_to :status
मैं एक कॉलबैक कभी भी चलाना चाहते हैं status_id
एक का page
बदल गया है।
इसलिए, अगर page.status_id
4 से 5 तक जाता है , तो मैं इसे पकड़ना चाहता हूं।
ऐसा कैसे करें?
जवाबों:
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+
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
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
attribute_changed?
रेल 5.1 में हटाई गई है, अब बस का उपयोगwill_save_change_to_attribute?
।
अधिक जानकारी के लिए, इस समस्या को देखें ।
इसे इस्तेमाल करे
after_validation :do_something, if: ->(obj){ obj.status_id.present? and obj.status_id_changed? }
def do_something
# your code
end