2011-05-28 10 views
6

मैं एक एसोसिएशन के लिए सेटटर को ओवरराइड करना चाहता हूं, लेकिन write_attribute() काम नहीं कर रहा है - शायद क्योंकि यह विधि केवल डेटाबेस कॉलम के लिए काम करती है।रेल में एसोसिएशन के लिए write_attribute के बराबर क्या है?

मैंने सुपर() की कोशिश की है, लेकिन यह काम नहीं करता है (ऐसा नहीं लगता था कि यह होगा ... लेकिन यह अनुमान लगाने योग्य था)।

मैं सेटर को ओवरराइड कैसे करूं?

def parent=(value) 
    # this line needs to be changed 
    write_attribute(:parent, value) 

    if value.subject.start_with?('Re:') 
     self.subject = "#{value.subject}" 
    else 
     self.subject = "Re: #{value.subject}" 
    end 

    self.receivers << value.sender 
    end 

उत्तर

3

मैं एक तरह से यह करने के लिए मिल गया है, लेकिन मैं इसे से परेशान कर रहा हूँ:

alias_method :old_parent=, :parent= 

    def parent=(value) 
    self.old_parent = value 

    if value.subject.start_with?('Re:') 
     self.subject = "#{value.subject}" 
    else 
     self.subject = "Re: #{value.subject}" 
    end 

    self.receivers << value.sender 
    end 

एक बात मैं जरूरी रेल के बारे में पसंद नहीं है वह यह है कि यहाँ मैं क्या करने की कोशिश कर रहा हूँ जब भी आप कुछ ऐसा करना चाहते हैं जो मानदंड से बाहर है, लेकिन किसी भी माध्यम से अनुचित नहीं है - "अंतर्ज्ञान" आपके अंतर्ज्ञान के साथ कितना अलग होगा।

यह कोई समस्या नहीं है जब आप अपवादों को जानते हैं, लेकिन जब आप सीख रहे हैं, तो इस तरह की अनियमितता और चीजों को कैसे करना है इस पर असंगतता सीखना कठिन होता है - आसान नहीं।

जावा सीखना शुरू में कठिन हो सकता है, लेकिन यह और अधिक संगत है। जावा में सोचने के बाद आपका अंतर्ज्ञान आपको बहुत आगे ले जा सकता है। रेल में सोचने के बाद यह सच नहीं है। रेल कुछ बातें करने के तरीके पर कॉल करने और याद रखने के तरीकों के बारे में याद रखने के बारे में है। जावा में, आप इसे और अधिक कारण बता सकते हैं ... और इंटेलिजेंस बाकी में भर जाता है।

मैं बस निराश हूं। यह मेरे लिए एक पुनर्मूल्यांकन पैटर्न है - मैं कुछ ऐसा करना चाहता हूं जो ढांचे के उदाहरणों की तुलना में सिर्फ "थोड़ा अधिक जटिल" है ... और "कैसे" असंगत है और 30 मिनट या शायद घंटे का पता लगाने और जवाब खोजने के लिए भी लगता है यह।

0
बजाय

def parent=(value) 
    write_attribute(:parent, value) 
end 

तुम सिर्फ ऐसा नहीं किया जा सका:

def parent=(parent) 
    parent_id = parent.id 
end 
11

क्या मेरे लिए काम किया निम्नलिखित है:

def parent=(new_parent) 
    # do stuff before setting the new parent... 

    association(:parent).writer(new_parent) 
end 
3

में रेल 4.2.1 दस्तावेज़:

# Association methods are generated in a module that is included into the model class, 
# which allows you to easily override with your own methods and call the original 
# generated method with +super+. For example: 
# 
# class Car < ActiveRecord::Base 
#  belongs_to :owner 
#  belongs_to :old_owner 
#  def owner=(new_owner) 
#  self.old_owner = self.owner 
#  super 
#  end 
# end 
संबंधित मुद्दे