2012-02-08 8 views
7

Stackoverflow में जवाब के साथ हाल ही में अच्छे भाग्य की भी नहीं होने (मुझे लगता है मैं tumbleweed पुरस्कार का राजा हूँ) लेकिन यहाँ वैसे भी चला जाता है:रेल अद्यतन केवल रिक्त फ़ील्ड

मैं केवल फ़ील्ड खाली हैं अद्यतन कर सकते हैं कैसे ActiveRecord का उपयोग करते समय? मैं इस कोड है:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
:starring => slave_info.starring, 
:theatrical => slave_info.theatrical } 

और की तरह कुछ करना चाहते हैं:

master_info.update_attributes({:originalTitle => slave_info.originalTitle, if !master_info.originalTitle.present?                   
:starring => slave_info.starring, if !master_info.starring.present? 
:theatrical => slave_info.theatrical if !master_info.theatrical.present? } 

मैं एक समय में यह एक पंक्ति कर सकता है, लेकिन उस से बचने के लिए कोशिश कर रहा हूँ:

master_info.update_attributes(:originalTitle => slave_info.originalTitle) if !master_info.originalTitle.present? 

मैं कुछ पढ़ें:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
          :starring => slave_info.starring, 
          :theatrical => slave_info.theatrical }.reject{ |key, value| value.present?}) 

लेकिन यह काम नहीं करता है, यह कुछ भी अद्यतन नहीं करता है, यहां तक ​​कि खाली फ़ील्ड भी नहीं।

वास्तव में, आदर्श नाम क्या है कि फील्ड नाम दोहराना नहीं है क्योंकि वे सभी मास्टर और दास दोनों में समान हैं, लेकिन मैं एक सक्रिय रिकॉर्ड पर एक नहीं कर सकता। लेकिन यह एक माध्यमिक समस्या है, प्राथमिक एक खाली खेतों को अद्यतन कर रहा है।

यहाँ इस एक एक tumbleweed :)

उत्तर

0

आप इस

def update_attributes(attributes) 
    attributes.each{|attr| attributes.delete(attr) unless read_attribute(attr).empty?} 
    super(attributes) 
end 

मैं परीक्षण किया है कि यह कोड तो समायोजित किया जा सकता है की तरह कुछ के साथ अपने मॉडल में update_attributes ओवरराइड कर सकते हैं नहीं मिलता है उम्मीद कर रहा है जरूरत है।

+1

और यदि आप आसपास अपडेट करने का मूल तरीका रखना चाहते हैं, तो आपको अधिभार के बजाय एक और विधि परिभाषित करनी चाहिए। – ksol

+0

मुझे खेद है, मुझे समझ में नहीं आता है। यदि वे प्राप्त करने वाले अंत में खाली हैं तो मैं विशेषताओं को अपडेट करना चाहता हूं। यह कोड ऐसा लगता है जैसे आने वाले फ़ील्ड से खाली विशेषताओं को हटा देता है। या क्या मैं इसे गलत पढ़ रहा हूँ? – kakubei

+0

मुझे खेद है, मैं तब तक बदल गया जब तक read_attribute (attr) .empty? '। –

7

थोड़ा सा बाद में लेकिन सोचा कि मैं जोड़ूंगा कि अगर कोई इसे उपयोगी पाता है तो मैंने इसे कैसे किया।

मैंने पहले जवाब में फ़ंक्शन का उपयोग किया और इसे नीचे संशोधित किया। जैसा कि @ksol ने अपनी टिप्पणी में कहा था, आप शायद मूल update_attributes विधि को रखना चाहते हैं, इसलिए मैंने इसे अपने मॉडल में जोड़ा। मुझे यकीन है कि इसे वैश्विक रूप से शामिल किया जा सकता है यदि आप इसे कई मॉडलों के लिए चाहते थे।

def update_attributes_only_if_blank(attributes) 
    attributes.each { |k,v| attributes.delete(k) unless read_attribute(k).blank? } 
    update_attributes(attributes) 
end 

यह हैश से किसी भी विशेषता को हटा देता है जब तक कि उसके पास पहले से कोई मान न हो। फिर यह शेष गुणों को सामान्य के रूप में अद्यतन करता है।

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