2010-04-29 13 views
18

मेरे पास दो मॉडल, उपयोगकर्ता और प्रचार हैं। विचार यह है कि एक पदोन्नति में कई उपयोगकर्ता हो सकते हैं, और उपयोगकर्ता के पास कई प्रचार हो सकते हैं।एक has_and_belongs_to_many रिश्ते में रिकॉर्ड जोड़ें

class User < ActiveRecord::Base 
    has_and_belongs_to_many :promotions 
end 

class Promotion < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

मेरे पास कोई भी आईडी नहीं है, इसके साथ ही कोई प्रोमोशन_यूसर टेबल/मॉडल भी है। यह user_id और promotionions_id

class PromotionsUsers < ActiveRecord::Base 
end 

तो, मैं प्रचार को उपयोगकर्ता कैसे जोड़ूं? मैं कुछ इस तरह की कोशिश की है:

user = User.find(params[:id]) 
promotion = Promotion.find(params[:promo_id]) 
promo = user.promotions.new(promo) 

यह निम्न त्रुटि में परिणाम है:

NoMethodError: undefined method `stringify_keys!' for #<Promotion:0x10514d420> 

अगर मैं इस लाइन के बजाय का प्रयास करें: प्रोमो = user.promotions.new (promo.id)

मैं इस त्रुटि मिलती है:

TypeError: can't dup Fixnum 

मुझे यकीन है कि मेरी probl के लिए एक बहुत ही आसान समाधान है कि वहाँ हूँ एम, और मैं सिर्फ समाधान के लिए सही तरीके से खोज नहीं कर रहा हूं।

उत्तर

35
user = User.find(params[:id]) 
promotion = Promotion.find(params[:promo_id]) 
user.promotions << promotion 

user.promotions उपयोगकर्ता से जुड़े प्रचारों की एक श्रृंखला है।

आपके द्वारा उपलब्ध सभी अलग-अलग कार्यों के लिए apidock देखें।

+0

धन्यवाद की जरूरत नहीं पैदा करते हैं। मैंने सोचा कि मैं चीजों को खत्म कर रहा था। –

+0

करता है << एसोसिएशन को भी बचाता है? – Nonconformist

+0

@ Coolguy123 हां, 'संग्रह << (ऑब्जेक्ट, ...) 'संग्रह.push और collection.concat का उपनाम है। यह तुरंत मूल ऑब्जेक्ट पर सहेजने या अद्यतन कॉल के इंतजार किए बिना अद्यतन एसक्यूएल को फायर करता है। – stereoscott

9

तुम बस

User.promotions = promotion #notice that this will delete any existing promotions 

या

User.promotions << promotion 

आप has_and_belongs_to_many के बारे में संबंध here पढ़ सकते हैं कर सकते हैं।

+1

'user.promotions = promotion' से सावधान रहें क्योंकि यह किसी भी मौजूदा को हटा देगा और इसमें से एक को जोड़ देगा। –

+1

जे।, मैंने http://railsapi.com नहीं देखा है। यह कमाल का है! Http://api.rubyonrails.org से बहुत बेहतर है। –

+0

@ टोनी: हाँ, मुझे पता है कि:] Tks। –

8

यह भी

User.promotion.build(attr = {}) 

हां, तो पदोन्नति वस्तु की बचत होती है, जब आप उपयोगकर्ता वस्तु को बचाने के लिए उपयोगी है।

और यह

User.promotion.create(attr = {}) 

है पदोन्नति आप इसे या उपयोगकर्ता मॉडल त्वरित प्रतिक्रिया के लिए बचाने के लिए

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