2010-04-22 121 views
0

警告:我可能有错误的'问题陈述',但这里有:如何通过关联has_many通过关联在rails中执行has_many?

活动有许多联系人。

一个活动有很多电子邮件。

因此,联系人通过广告系列有很多电子邮件。

而且电子邮件可以通过广告系列拥有多个联系人。

每个联系人 - 电子邮件对具有自己独特的状态(状态1,状态2等)。

每个状态(对于联系人 - 电子邮件对)都有自己的用户。

我不知道如何建模状态或用户。目前眼前的挑战是状态。

(参见下图)下面

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

回答

0

溶液假设状态可以表示为一个字符串。

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_email = @contact.contact_emails.build(:user => current_user, 
     :email => @email, :status => "status1") 

contact_email.save 

OR

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

或创建多个:

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

编辑2 ContactEmail的嵌套资源。

map.resources :contacts, has_many :contact_emails 

网址为ContactEmail

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

的URL没有电子邮件ID。您可以通过EMAIL_ID作为查询参数,即

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

在你ContactEmailsController:

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

so ContactEmail是一种代表联系人 - 电子邮件对的新模型吗? – Angela 2010-04-23 00:46:54

+0

是的,ContactEmail是一对。 – 2010-04-23 02:22:26

+0

所以ContactEmail也需要有自己的属性,与Email完全一样(但是使用邮件文本?)或者它只是一个占位符,并且电子邮件被发送并且内容从不存储? – Angela 2010-04-23 03:29:51