2010-04-29 5 views
18

J'ai deux modèles, utilisateurs et promotions. L'idée est qu'une promotion peut avoir de nombreux utilisateurs, et un utilisateur peut avoir beaucoup de promotions. J'ai également un tableau/modèle promotions_users, sans identifiant propre. Il référence user_id et promotions_idAjouter un enregistrement à une relation has_and_belongs_to_many

class PromotionsUsers < ActiveRecord::Base 
end 

Alors, comment ajouter un utilisateur à une promotion? J'ai essayé quelque chose comme ceci:

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

Il en résulte l'erreur suivante:

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

Si au contraire je tente cette ligne: promo = user.promotions.new (promo.id)

Je reçois cette erreur:

TypeError: can't dup Fixnum 

Je suis sûr qu'il ya une solution très facile à mes probl em, et je ne cherche pas la solution de la bonne façon.

Répondre

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

user.promotions est un tableau des promotions liées à l'utilisateur.

Voir le apidock pour les différentes fonctionnalités dont vous disposez.

+0

Merci pour la réponse rapide. Je pensais que j'étais trop compliqué. –

+0

fait << aussi sauvegarder l'association? – Nonconformist

+0

@ Coolguy123 oui, 'collection << (objet, ...)' est un alias de collection.push et collection.concat. Cela déclenche instantanément la mise à jour sql sans attendre l'appel save ou update sur l'objet parent. – stereoscott

9

Vous pouvez le faire

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

ou

User.promotions << promotion 

Vous pouvez lire has_and_belongs_to_many relation here.

+1

Soyez prudent avec 'User.promotions = promotion' car cela supprimera tout existant et ajouter celui qui est passé. –

+1

j., Je n'ai pas vu http://railsapi.com. C'est génial! Tellement mieux que http://api.rubyonrails.org. –

+0

@Tony: Oui, je sais que:] Tks. –

8

Il est aussi utile

User.promotion.build(attr = {}) 

donc, objet de promotion sauve, lorsque vous enregistrez l'objet utilisateur.

Et c'est

User.promotion.create(attr = {}) 

créer la promotion que vous avez pas besoin de l'enregistrer ou d'un modèle utilisateur

Questions connexes