2010-04-22 17 views
0

경고 : '문제 진술'이 잘못되었을 수 있지만 여기에 표시됩니다.레일에서 연관을 통해 has_many 연관을 통해 has_many 연관을 수행하려면 어떻게해야합니까?

캠페인에 많은 연락처가 있습니다.

캠페인에 많은 이메일이 있습니다.

따라서 연락처에는 캠페인을 통해 많은 이메일이 있습니다.

이메일에는 캠페인을 통해 많은 연락처가있을 수 있습니다.

각 연락처 - 이메일 쌍에는 고유 한 상태 (status1, status2 등)가 있습니다.

각 상태 (연락처 - 이메일 쌍용)에는 고유 한 사용자가 있습니다.

상태 또는 사용자를 모델하는 방법을 모르겠습니다. 현재 즉각적인 문제는 상태입니다.

alt text http://img88.imageshack.us/img88/7086/statusassociations.png

답변

0

해결 다음 그 상태를 문자열로 나타낼 수있다 가정한다 (아래 그림 참조).

contact_email = @contact.contact_emails.build(:user => current_user, 
     :email => @email, :status => "status1") 

contact_email.save 

또는

@contact.contact_emails.create(:user => current_user, 
    :email => @email, :status => "status1") 

또는 여러 작성 : 이메일을 추가

class Campaign < ActiveRecord::Base 
    has_many :contacts 
end 

class Contact < ActiveRecord::Base 
    belongs_to :campaign 
    has_many :contact_emails 
    has_many :emails, :through => :contact_emails 
end 

class ContactEmail < ActiveRecord::Base 
    belongs_to :contact 
    belongs_to :email 
    belongs_to :user 
    # add a column called status 
end 

class Email < ActiveRecord::Base 
    has_many :contact_emails 
    belongs_to :contacts, :through => :contact_emails 
end 

은 연락하는

@contact.contact_emails.create(
    [ 
    { 
     :user => current_user, 
     :email => @email, 
     :status => "status1" 
    }, 
    { 
     :user => current_user, 
     :email => @email2, 
     :status => "status2" 
    } 
    ] 
) 

편집 2ContactEmail의 중첩 된 자원입니다. CONTACTEMAIL

/contacts/1/contact_emails/new #new 
/contacts/1/contact_emails/2/edit #edit 

의 URL에 대한

map.resources :contacts, has_many :contact_emails 

URL은 이메일 ID가 없습니다. 당신은 당신의 ContactEmailsController에서 쿼리 매개 변수로 EMAIL_ID, 즉

new_contact_contact_email_path(@contact, :email_id => @email) 

을 전달할 수 있습니다보기에

def new 
    @contact = Contact.find(params[:contact_id]) 
    @email = Email.find(params[:email_id]) 
    @contact_email = @contact.contact_emails.build(:email => @email) 
end 

email_id 숨겨진 필드를 설정합니다.

create 메서드는 저장을 수행합니다.

def create 
    @contact = Contact.find(params[:contact_id]) 
    @contact_email = @contact.contact_emails.build(params[:contact_email]) 
    if @contact_email.save 
    # success 
    else 
    # error 
    end 
end 
+0

그래서 ContactEmail은 연락처 이메일 쌍을 나타내는 새로운 모델입니까? – Angela

+0

예, ContactEmail이 쌍입니다. –

+0

그럼 ContactEmail도 이메일과 똑같은 속성을 가질 필요가 있습니다 (메일이 병합 되었습니까?) 아니면 그냥 장소 소유자이고 전자 메일이 전송되고 내용이 저장되지 않습니까? – Angela

관련 문제