2010-04-29 19 views
18

Tengo dos modelos, usuarios y promociones. La idea es que una promoción puede tener muchos usuarios y un usuario puede tener muchas promociones.Agregar registro a una relación 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 

También tienen una mesa promotions_users/modelo, sin ID de su cuenta. Hace referencia a user_id y promotions_id

class PromotionsUsers < ActiveRecord::Base 
end 

Entonces, ¿cómo agrego un usuario a una promoción? He intentado algo como esto:

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

Esto da como resultado el siguiente error:

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

Si trato de esta línea en su lugar: promo = user.promotions.new (promo.id)

consigo este error:

TypeError: can't dup Fixnum 

estoy seguro de que hay una solución muy fácil de mis probl em, y simplemente no estoy buscando la solución de la manera correcta.

Respuesta

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

user.promotions es una matriz de las promociones vinculadas al usuario.

Consulte el apidock para conocer las diferentes funciones que tiene disponibles.

+0

Gracias por la rápida respuesta. Pensé que estaba complicando las cosas. –

+0

does << también guarda la asociación? – Nonconformist

+0

@ Coolguy123 sí, 'colección << (objeto, ...)' es un alias de collection.push y collection.concat. Esto dispara instantáneamente la actualización sql sin esperar la llamada de guardar o actualizar en el objeto principal. – stereoscott

9

Puede hacer precisamente

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

o

User.promotions << promotion 

Usted puede leer sobre has_and_belongs_to_many relación here.

+1

Tenga cuidado con 'User.promotions = promotion' porque eso eliminará cualquier existente y agregará el que se haya pasado. –

+1

j., No he visto http://railsapi.com. ¡Esto es asombroso! Mucho mejor que http://api.rubyonrails.org. –

+0

@Tony: Sí, lo sé:] Tks. –

8

Esto también es útil

User.promotion.build(attr = {}) 

modo, objeto de promoción salva, cuando se guarda el objeto Usuario.

Y esto es

User.promotion.create(attr = {}) 

crear promoción que no es necesario guardarlo o modelo del usuario

Cuestiones relacionadas