警告:我可能有错误的“问题陈述”,但它是这样的:
一个活动有许多联系人。
一个活动有许多电子邮件。
因此,一个联系人通过一个活动有许多电子邮件。
一个电子邮件可以通过一个活动拥有多个联系人。
每个联系人-电子邮件对都有自己独特的状态(状态 1、状态 2 等)。
每个状态(对于联系人-电子邮件对)都有自己的用户。
我不知道如何为状态或用户建模。目前,最直接的挑战是状态。
(见下图)
警告:我可能有错误的“问题陈述”,但它是这样的:
一个活动有许多联系人。
一个活动有许多电子邮件。
因此,一个联系人通过一个活动有许多电子邮件。
一个电子邮件可以通过一个活动拥有多个联系人。
每个联系人-电子邮件对都有自己独特的状态(状态 1、状态 2 等)。
每个状态(对于联系人-电子邮件对)都有自己的用户。
我不知道如何为状态或用户建模。目前,最直接的挑战是状态。
(见下图)
下面的解决方案是假设状态可以表示为一个字符串。
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
或者
@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"
}
]
)
编辑 ContactEmail 的 2 个嵌套资源。
map.resources :contacts, has_many :contact_emails
ContactEmail 的 URL
/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