10

बचत अगर मैं निम्नलिखित है करता है:कैसे after_save काम जब एक वस्तु

@user.name = "John"  
@user.url = "www.john.com" 
@user.save 

अगर मैं का उपयोग after_save

@user.url = "www.johnseena.com" 
@user.save 

क्या होगा जब मैं यह कर?

मेरा मानना ​​है कि इसे 'after_save' कॉलबैक के कारण मान को सहेजना चाहिए।

+0

क्या आप वास्तव में 'after_save' कॉलबैक में इंस्टेंस वैरिएबल '@ user' का उपयोग कर रहे हैं? – Samiron

+2

आपको वास्तव में यह समझाने के लिए काम करना होगा कि आपको थोड़ा बेहतर क्या चाहिए और आपने जो कोशिश की है उसके कुछ और उदाहरण दें। – simonmorley

उत्तर

27

मेरी राय में, यदि आप save कॉल को after_save कॉलबैक में फ़ंक्शन करते हैं, तो यह तब तक एक रिकर्सन में फंस जाएगा जब तक आप शुरुआत में गार्ड नहीं डालते। इस

class User < AR::Base 
     after_save :change_url 

     def change_url 
      #Check some condition to skip saving 
      url = "www.johnseena.com" 
      save    #<======= this save will fire the after_save again 
     end 
end 

हालांकि तरह, के अलावा एक गार्ड लगाने से, आप update_column भी

def change_url 
    update_column(:url, "www.johnseena.com") 
end 

उपयोग कर सकते हैं इस मामले में यह after_save आग नहीं होगा। हालांकि, यह after_update आग लग जाएगा। तो अगर आप वापस तो है कि फोन पर किसी भी अद्यतन आपरेशन है कि आप फिर से प्रत्यावर्तन में हैं :)

+0

आपके समय के लिए धन्यवाद देने का शानदार तरीका। – SSP

+1

नोट: '# update_column' वास्तव में [कॉलबैक छोड़ देता है] (http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_columns)। – jibiel

4

यदि आप after_save में कुछ भी संशोधित करते हैं तो यह सहेजा नहीं जाएगा, क्योंकि save पहले से ही हो चुका है। हस्तक्षेप करने का एकमात्र मौका पूरे लेनदेन को रोलबैक करना है। यदि आप after_save में save जोड़ते हैं, तो यह एक अनंत लूप होगा।

6

after_save कॉलबैक पर ध्यान दिए बिना अपने ट्रिगर किया जाएगा एक बचाने या उस वस्तु पर एक अद्यतन

इसके अलावा,

update_column किसी भी कॉलबैक को गति प्रदान नहीं करता है (यानी after_update) और भी सत्यापन को छोड़ देता है। देख http://apidock.com/rails/ActiveRecord/Persistence/update_column

यू विशेष रूप से after_create या after_update संचालन और उसके समय पर निर्भर करता है का उपयोग करना चाहिए।

after_create :send_mail 
def send_x_mail 
    #some mail that user has been created 
end 

after_update :send_y_mail 
def send_y_mail 
    #some data has been updated 
end 

after_save :update_some_date 
def update_some_data 
    ... 
    action which doesnt update the current object else will trigger the call_back 
end 

इसके अलावा What is the difference between `after_create` and `after_save` and when to use which? देख सकते हैं और कॉलबैक इसके बजाय डेटाबेस के लिए दो प्रश्नों प्रदर्शन और प्रत्यावर्तन के बारे में चिंता की देख के लिए http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000059

+0

'after_update' और 'first_update' दोनों रेल के रूप में मौजूद हैं 4.1। आप [रेल गाइड] से उपलब्ध कॉलबैक की पूरी सूची देख सकते हैं (http://guides.rubyonrails.org/active_record_callbacks.html#available- कॉलबैक) –

1

, तो आप सिर्फ डेटा पेलोड संशोधित करने से पहले यह सर्वर को जाता है पर विचार कर सकते।

class User < AR::Base 
     before_save :change_url 

     def change_url 
      url = "www.johnseena.com" 
     end 
end 
0

हर किसी के लिए बहुत धन्यवाद जिन्होंने मुझे यहां मदद की। यहां वह समाधान है जिसने मेरी समस्या हल की है। मैंने ऑर्डर मॉडल द्वारा निम्नलिखित में संशोधित किया:

class Order < ActiveRecord::Base 

    has_and_belongs_to_many :users 

    validates :item, presence: true 

    def add_order(username, order) 
    user = User.where(username: username).first 
    if !user.nil? 
     user.orders.create(item: order.item) 
    end 
    end 

    def remove_order(order) 
    end 

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