2010-04-29 3 views
18

У меня две модели, пользователи и продвижение по службе. Идея состоит в том, что продвижение может иметь много пользователей, и у пользователя может быть много рекламных акций.Добавить запись в has_and_belongs_to_many relationship

class User < ActiveRecord::Base 
    has_and_belongs_to_many :promotions 
end 

class Promotion < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

У меня также есть таблица/модель promotionions_users, без собственного идентификатора. Он ссылается на 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 

Я уверен, что есть очень простое решение для моих пробл em, и я просто не ищу решение правильно.

ответ

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

user.promotions - это набор рекламных акций, привязанных к пользователю.

См. apidock для всех различных функций, которые у вас есть.

+0

Спасибо за быстрый ответ. Я подумал, что я слишком обижен. –

+0

делает << также сохранить связь? – Nonconformist

+0

@ Coolguy123 yes, 'collection << (object, ...)' - это псевдоним collection.push и collection.concat. Это мгновенно запускает обновление sql без ожидания вызова сохранения или обновления родительского объекта. – 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

j., Я не видел http://railsapi.com. Это круто! Настолько лучше, чем http://api.rubyonrails.org. –

+0

@ Тони: Да, я знаю это:] Tks. –

8

Это также полезно

User.promotion.build(attr = {}) 

так, объект продвижение сохраняет, при сохранении объекта пользователя.

И это

User.promotion.create(attr = {}) 

создать продвижение вам не нужно, чтобы сохранить его или модель пользователя

Смежные вопросы