2011-01-19 11 views
15

पूरे दिन Google पर खर्च करें, लेकिन कोई जवाब नहीं मिल रहा है। : \रेल: कई (एचएबीटीएम) के पास है और संबंधित है - अन्य रिकॉर्ड बनाने के बिना एसोसिएशन बनाएं

मेरे पास उपयोगकर्ताओं और Core_Values ​​के बीच एक HABTM संबंध है।

  1. एक CoreValue मौजूद नहीं है, तो एक नया बना तथा उसे किसी उपयोगकर्ता आईडी के साथ संबद्ध है, और
  2. मान लिया जाये:

    class CoreValue < ActiveRecord::Base 
        has_and_belongs_to_many :users 
    
    class User < ActiveRecord::Base 
        has_and_belongs_to_many :core_values 
    

    मेरी नियंत्रक में, मैं दो अलग-अलग काम करने होंगे मैं जानता हूँ कि एक विशेष CoreValue भी मौजूद हैं, किसी भी नए CoreValues ​​या उपयोगकर्ता

# 1 के लिए बनाए बिना संघ पैदा नहीं करता है, मैं इस काम करने के लिए मिल गया है:

+०१२३५१६४१०६
User.find(current_user.id).core_values.create({:value => v, :created_by => current_user.id}) 

यह एक नया कोरवैल्यू बनाता है: मूल्य और: बनाया_by और एसोसिएशन बनाता है।

# 2 के लिए, मैंने कुछ चीजों की कोशिश की है, लेकिन केवल एसोसिएशन बनाने के लिए प्रतीत नहीं हो सकता है।

आपकी मदद के लिए धन्यवाद!

उत्तर

21

आप इसे बहुत ही उपयोगी find_or_create विधि का उपयोग करके दो चरणों की प्रक्रिया में कर सकते हैं। find_or_create पहले रिकॉर्ड खोजने का प्रयास करेगा, और यदि यह अस्तित्व में नहीं है, तो इसे बनाएं।

core_value = CoreValue.find_or_create_by_value(v, :created_by => current_user.id) 
current_user.core_values << core_value 

कुछ नोट::

  • पहली पंक्ति को खोजने या मूल्य v पैदा करेगा कुछ इस तरह चाल करना चाहिए। यदि यह अस्तित्व में नहीं है और बनाया गया है, तो यह created_by को current_user.id पर सेट करेगा।
  • User.find(current_user.id) करने की कोई आवश्यकता नहीं है, क्योंकि यह उसी वस्तु को current_user के रूप में वापस कर देगा।
  • current_user.core_values एक सरणी है, और आप << का उपयोग कर आसानी से एक और मूल्य जोड़ सकते हैं।

संक्षिप्तता के लिए, निम्न ऊपर कोड उदाहरण के रूप में ही होगा:

current_user.core_values << CoreValue.find_or_create_by_value(v, :created_by => current_user.id) 
+0

धन्यवाद के लिए

चेक this बनाया जाएगा! पता नहीं था core_values ​​एक सरणी थी - और निश्चित रूप से पता नहीं था कि सरणी में जोड़ने से INSERT बन जाएगा। मिठाई! यदि रिकॉर्ड मौजूद नहीं है तो केवल एसोसिएशन बनाने का कोई तरीका है? मैं सरणी विधियों के माध्यम से देखता हूँ, मुझे लगता है? शायद current_user.core_values.include? – jmccartie

+0

@jmccartie यह करने का एक तरीका हो सकता है, हाँ। स्पष्टीकरण के लिए, मुझे लगता है कि मुझे यह जोड़ना चाहिए कि 'core_values' हमेशा * एक सरणी नहीं है - जैसा कि आप जानते हैं, आप 'core_values.create' को कॉल कर सकते हैं जो मान्य सरणी विधि नहीं है। एक बेहतर परिभाषा यह होगी कि यह "एक सरणी के रूप में कार्य करता है।" फॉलो-अप के लिए – vonconrad

+0

धन्यवाद। शामिल? काम नहीं करेगा अगर मैं current_user.core_values ​​के अंदर नई कोर_वल्यू आईडी पा सकता हूं तो पता लगाने की कोशिश कर रहा हूं ... hmmmm – jmccartie

4

अपने उपयोगकर्ता मॉडल में एक विधि जोड़ें:

class User < ActiveRecord::Base 
    def assign_core_value(v) 
    core_values.find_by_name(v) || (self.core_values << 
     CoreValue.find_or_create_by_name(:name => v, :created_by => self)).last 
    end 
end 

assign_core_value विधि आवश्यकता 1 से मिलता है, 2 और उपयोगकर्ता को दिए गए मूल मूल्य (दिए गए नाम के साथ) देता है।यदि CoreValue पहले से ही उपयोगकर्ता से संबद्ध है

1) चेकों: 1

विधि तर्क इस प्रकार है

current_user.assign_core_value(v) 

नोट:

अब आप निम्न कर सकते हैं। यदि ऐसा है तो कोई कार्रवाई नहीं की जाती है, मूल मूल्य वापस कर दिया जाता है।

2) चेक किया गया है कि दिए गए नाम के साथ CoreValue मौजूद है या नहीं। यदि CoreValue नहीं बनाता है। उपयोगकर्ता के साथ मूल मूल्य (बनाया/मिला) संबद्ध करता है।

+0

धन्यवाद! उपयोगकर्ता मॉडल में इसे जोड़ने का अच्छा विचार। यदि यह पहले से मौजूद है तो क्या यह संघ बनायेगा? – jmccartie

+0

कुछ स्पष्टीकरण के साथ मेरा जवाब अपडेट किया गया। जरा देखो तो। –

0

सक्रिय रिकॉर्ड पहले से ही आपको एक विधि देता है। आपके मामले में,

val = CoreValue.find_by_value(v) 
current_user.core_values << val 

आप इस तरह से कई वस्तुओं को भी पारित कर सकते हैं। सभी संघों में अधिक जानकारी के

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