2010-04-29 5 views
18

두 가지 모델, 사용자 및 프로모션이 있습니다. 아이디어는 프로모션이 많은 사용자를 가질 수 있으며 사용자는 많은 프로모션을 가질 수 있다는 것입니다.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 

고유 ID가없는 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> 

내가 대신이 줄을 시도하는 경우 : 프로모션 = user.promotions.new (promo.id를)

내 probl에 매우 쉬운 솔루션이 있음을 확신

TypeError: can't dup Fixnum 

:

나는이 오류 그리고 저는 솔루션을 올바른 방향으로 찾고 있지 않습니다.

답변

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

user.promotions은 사용자에게 연결된 판촉의 배열입니다.

사용할 수있는 모든 기능에 대해서는 apidock을 참조하십시오.

+0

감사합니다 그것을 또는 사용자 모델을 저장 할 필요가 홍보를 만들

User.promotion.create(attr = {}) 

입니다. 내가 물건을 너무 복잡하게 만들었다 고 나는 생각했다. –

+0

<< 또한 연관을 저장합니까? – Nonconformist

+0

@ Coolguy123 예,'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 = {}) 

때문에, 승진 객체는 사용자 객체를 저장할 때 저장 유용합니다.

그리고 이것은 당신이 빠른 응답을

관련 문제