2012-06-15 12 views
11

मुझे एक दिलचस्प समस्या है। मैं रूबी 1.9.2 और रेल 3.1.3 का उपयोग कर रहा हूँ।सरणी में रेल धक्का ऑब्जेक्ट बचाता है

मेरे पास 2 मॉडल हैं, सरलीकरण के लिए ग्राहकों और दुकानों का कहना है। स्टोर में कई ग्राहक हैं, और ग्राहक एक स्टोर से संबंधित है। मैं सभी ग्राहकों को एक स्टोर के लिए एकत्र करने की कोशिश कर रहा हूं, और कुछ और जगहों के लिए एक जगह बना रहा हूं जिसे मैं बाद में मूल्यों के साथ पॉप्युलेट कर सकता हूं। इसके बजाय, ग्राहक.save को तब कहा जाता है जब मुझे इसकी उम्मीद नहीं होती है।

store = Store.find(1) 
customers_array = store.customers 
random_array = Array.new 
customers_count = customers_array.count + 1 

(customers_count..2).each do |i| 
    customer = Customer.new 
    c.id = "#{i}000000000000" 
    random_array << customer # this line doesn't call customer.save 
    customers_array << customer # this line calls customer.save when store has customers 
end 

किसी कारण से जब ग्राहक को सरणी में धकेल दिया जाता है, तो ग्राहक.save कहा जाता है। ऐसा नहीं होता है यदि आप किसी सरणी को दबाते हैं तो एक सादा सरणी है और संबंध नहीं है।

मुझे एक कामकाज मिला, लेकिन मैं अभी भी सोच रहा हूं कि ऐसा क्यों होता है। वैकल्पिक हल:

store = Store.find(1) 
initial_customers_array = store.customers 
additional_customers_array = Array.new 
customers_count = initial_customers_array.count + 1 

(customers_count..2).each do |i| 
    customer = Customer.new 
    c.id = "#{i}000000000000" 
    additional_customers_array << customer 
end 
customers_array = initial_customers_array + additional_customers_array 
+1

उन लोगों के लिए जो समाधान ढूंढ रहे हैं और क्यों नहीं: संग्रह के बिना मॉडल बनाने के लिए संग्रह पर '' 'build''' का उपयोग करें: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods .html # मॉड्यूल-ActiveRecord :: संघ :: कक्षा विधि-लेबल-संग्रह – blu

+0

मुझे विपरीत समस्या थी। मॉडल चश्मे में 'बिल्ड' का उपयोग करके, << काम नहीं कर रहा है। इस सवाल के जवाब बताते हैं क्यों नहीं। – CJBrew

उत्तर

21

<<ActiveRecord::Associations::CollectionProxy कॉल में push

जिसके लिए एक उपनाम है concat

जो concat_records

जहां डालने जगह ले जा रहा देख सकते हैं कहते हैं।

तो, एक मौजूदा रिकॉर्ड साथ, << या .push चल संग्रह में रिकॉर्ड दर्ज हो जाएगा उन्हें डेटाबेस के लिए बने यदि आवश्यक हो तो (डेटाबेस तक बना रहा)। किसी सरणी, नहीं रिकॉर्ड संग्रह पर << कॉलिंग, जैसा कि आप

random_array << customer 

में कर रहे हैं रूबी के << सरणी प्रणाली को बुलाती है, एआर बराबर (जैसा कि आप मिल गया है, कोई बचाने इस मामले में जगह लेता है) नहीं।

संपादित करें: स्पष्ट होने के लिए, आपको जो कामकाज मिला है वह उतना ही कम है जितना मैं आमतौर पर जिस परिस्थिति से निपट रहा हूं उसे संभालता हूं; मेरा उत्तर पर अधिक केंद्रित है क्यों<< इस व्यवहार में है।

3

इस के चारों ओर एक और तरीका है करने के लिए (आपके मूल कोड के) अपने दूसरी पंक्ति को बदलने के लिए होगा:

customers_array = store.customers.to_a 

कोई वास्तविक सरणी वस्तु को सक्रिय रिकॉर्ड संघ डाले यही कारण है, इसलिए << विधि सामान्य रहेगा ऐरे # पुश विधि।

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