Добавить запись в отношение has_and_belongs_to_many - PullRequest
24 голосов
/ 29 апреля 2010

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

class User < ActiveRecord::Base
  has_and_belongs_to_many :promotions
end

class Promotion < ActiveRecord::Base
  has_and_belongs_to_many :users
end

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

Если я попробую эту строку вместо: promo = user.promotions.new (promo.id)

Я получаю эту ошибку:

TypeError: can't dup Fixnum

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

Ответы [ 3 ]

46 голосов
/ 29 апреля 2010
user = User.find(params[:id])
promotion = Promotion.find(params[:promo_id])
user.promotions << promotion

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

См. apidock для всех доступных функций.

9 голосов
/ 29 апреля 2010

Вы можете сделать только

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

или

User.promotions << promotion

Вы можете прочитать о has_and_belongs_to_many отношениях здесь .

8 голосов
/ 29 апреля 2010

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

User.promotion.build(attr = {})

, поэтому объект промоакции сохраняется при сохранении объекта пользователя.

И это

User.promotion.create(attr = {})

Создать промоушен вы ненужно сохранить или модель пользователя

...