2012-03-06 12 views
15

Let मॉडल गुण Quote का उपयोग कर [price, description]रेल: दूसरे को कोई चीज से गुण प्रतिलिपि बनाई जा रही "गुण" विधि

Let मॉडल गुण Invoice[price, description, priority]

चलो invoice विशेषताओं के साथ मॉडल Invoice से एक वस्तु {price: 10, description: 'lamp', priority: 10}

invoice = {price: 10, description: 'lamp', priority: 10} 

मान लें कि मैं invoice विशेषताओं कोपर कॉपी करना चाहता हूं।

quote = Quote.new(invoice.attributes) 

यह एक त्रुटि है कि priority मॉडल Quote में existe नहीं है उठाती है।

मैं विशेषताओं को quote पर कैसे कॉपी करूं लेकिन केवल quote विशेषताएँ स्वीकार कर सकती हैं?

उत्तर

19

आप select केवल गुण Quote है कि कर सकते हैं:

Quote.new(invoice.attributes.select{ |key, _| Quote.attribute_names.include? key }) 

As noted by @aceofspades (लेकिन एक गतिशील समाधान के साथ नहीं), तो आप उपयोग कर सकते हैं ActiveSupport के slice रूप में अच्छी तरह:

Quote.new(invoice.attributes.slice(*Quote.attribute_names)) 
+0

सभी 'attribute_names' हालांकि कॉपी किया जाना चाहिए नहीं। 'id',' update_at' और 'create_at' शायद तत्कालता पर 'शून्य' होना चाहिए। – Mischa

+3

सिर्फ सरणी रिटर्न पास करना {}, नीचे एक का उपयोग करें! Quote.new (invoice.attributes.slice (* Quote.attribute_names)) – Ajay

+0

@ajay हाय, आपका उत्तर वास्तव में सहायक है। मुझे एक से अधिक विशेषताओं को जोड़ने के लिए एक ही परिदृश्य मिला है। इसलिए मुझे एक त्रुटि 'अपरिभाषित विधि विशेषताओं' मिली। मेरे द्वारा यह कैसे किया जा सकता है? धन्यवाद – Learner

0

सीधा रास्ता है इस तरह कुछ:

source = invoice.attributes 
target = (source.keys & Quote.attribute_names).inject({}) {|target, key| target[key] = source[key]; target } 
quote = Quote.new(target) 
12

ActiveSupport से स्लाइस विधि के बारे में कैसे?

quote = Quote.new(invoice.attributes.slice(:price, :description)) 

या यहाँ तक कि

quote = Quote.new(invoice.attributes.slice(*Quote.accessible_attributes)) 
+0

'access_attributes' में अजीब व्यवहार प्रतीत होता है, यह केवल उन गुणों को लौटाता है जिन्हें स्पष्ट रूप से 'attr_accessible' के साथ बनाया गया था, इसलिए डिफ़ॉल्ट रूप से इसमें कोई भी विशेषता नहीं होगी। यह मेरे लिए, हालांकि रेल में एक बग है। –

+0

attr_accessible वास्तव में एक अच्छा विचार है, attribute_names आपके उत्तर में भी काम करेगा। – aceofspades

+0

मुझे पता है कि आपको * चाहिए * लेकिन इसका मतलब यह नहीं है कि लोग ऐसा करते हैं (जैसा रविवार साबित हुआ था)। उस ने कहा कि मुझे उम्मीद है कि यह सभी सुलभ विशेषताओं को वापस कर देगा, न केवल उन लोगों के रूप में स्पष्ट रूप से चिह्नित। –

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