2010-04-29 9 views
18

Ich habe zwei Modelle, Benutzer und Aktionen. Die Idee ist, dass eine Werbeaktion viele Nutzer haben kann und ein Nutzer viele Aktionen haben kann.Hinzufügen von Datensatz zu einer Beziehung 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 

Ich habe auch eine promotions_users Tabelle/Modell, ohne ID der eigenen. Es verweist auf Benutzer-ID und Promotions-ID

class PromotionsUsers < ActiveRecord::Base 
end 

Also, wie füge ich einen Benutzer zu einer Aktion hinzu? Ich habe so etwas wie dies versucht:

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

Diese in der folgenden Fehler führt:

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

Wenn ich versuche, diese Zeile statt: Promo = user.promotions.new (promo.id)

ich diesen Fehler:

TypeError: can't dup Fixnum 

ich bin sicher, dass es eine sehr einfache Lösung, um meine probl ist em, und ich suche einfach nicht nach der richtigen Lösung.

Antwort

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

user.promotions ist ein Array der Werbeaktionen, die an den Benutzer gebunden sind.

Siehe apidock für alle verfügbaren Funktionen.

+0

Danke für die schnelle Antwort. Ich dachte, ich würde die Dinge übermäßig komplizieren. –

+0

speichert << auch die Zuordnung? – Nonconformist

+0

@ Coolguy123 Ja, 'Sammlung << (Objekt, ...)' ist ein Alias ​​von collection.push und collection.concat. Dadurch wird sofort sql ausgelöst, ohne auf den Speicher- oder Aktualisierungsaufruf für das übergeordnete Objekt zu warten. – stereoscott

9

können Sie tun nur

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

oder

User.promotions << promotion 

können Sie here über has_and_belongs_to_many Beziehung lesen.

+1

Seien Sie vorsichtig mit 'User.promotions = promotion', denn das wird alle vorhandenen löschen und die übergebene hinzufügen. –

+1

j., Ich habe http://railsapi.com nicht gesehen. Das ist fantastisch! So viel besser als http://api.rubyonrails.org. –

+0

@Tony: Ja, das weiß ich:] Tks. –

8

Dieses nützlich auch

User.promotion.build(attr = {}) 

so, Werbeobjekt speichert, wenn Sie Benutzerobjekt speichern.

Und das ist

User.promotion.create(attr = {}) 

Förderung schaffen Sie es oder User-Modell nicht speichern müssen