2010-04-29 15 views
18

İki modelim var, kullanıcılar ve promosyonlar. Fikir, bir tanıtımın birçok kullanıcıya sahip olabileceği ve bir kullanıcının çok sayıda promosyonu olabileceği düşüncesidir.Bir has_and_belongs_to_many ilişkisine kayıt ekleyin

class User < ActiveRecord::Base 
    has_and_belongs_to_many :promotions 
end 

class Promotion < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Ayrıca kendi tanıtımı olmayan bir promotions_users tablosuna/modeline sahibim. Bu, bir promosyona nasıl kullanıcı ekleyebilirim? Böyle bir şey denedim:

Bu aşağıdaki hatası
user = User.find(params[:id]) 
promotion = Promotion.find(params[:promo_id]) 
promo = user.promotions.new(promo) 

:

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

yerine bu satırı denerseniz: promo = user.promotions.new (promo.id)

benim Probl çok kolay bir çözümü vardır eminim

TypeError: can't dup Fixnum 

:

bu hatayı alıyorum em, ve ben sadece çözümü doğru şekilde aramıyorum.

cevap

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

user.promotions, kullanıcıya bağlanan tanıtımların bir dizisidir.

Kullanabileceğiniz tüm farklı işlevler için apidock'a bakın.

+0

Teşekkür bunu veya Kullanıcı modelini kaydetmek gerek tanıtım oluşturmak

User.promotion.create(attr = {}) 

olduğunu. Aşırı şeyler yaptığımı anladım. –

+0

<< aynı zamanda derneği de kaydeder mi? – Nonconformist

+0

@ Coolguy123 yes, 'collection << (object,…)' bir collection.push ve collection.concat takma addır. Bu, ana nesnede kaydetme veya güncelleştirme çağrısını beklemeden güncelleme sırasını anında tetikler. – stereoscott

9

sadece

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

veya

User.promotions << promotion 

Yaklaşık has_and_belongs_to_many ilişki here okuyabilir yapabilirsiniz.

+1

"User.promotions = promotion" seçeneğine dikkat edin, aksi halde mevcut olanı silinir ve girileni ekleyin. –

+1

j., Http://railsapi.com'u görmedim. Bu harika! Http://api.rubyonrails.org'dan çok daha iyi. –

+0

@Tony: Evet, bunu biliyorum:] Tks. –

8

Bu

User.promotion.build(attr = {}) 

yüzden, promosyon nesnesi Kullanıcı nesnesi kaydederken, kaydeder de yararlıdır.

Ve bu hızlı tepki için

İlgili konular