Ruby on rails 如何在rails中实现has\u many through关联?

Ruby on rails 如何在rails中实现has\u many through关联?,ruby-on-rails,ruby,has-many-through,Ruby On Rails,Ruby,Has Many Through,警告:我可能有错误的“问题陈述”,但它是这样的: 一场运动有很多联系人 竞选活动有很多电子邮件 因此,一个联系人通过一个活动有很多电子邮件 一封电子邮件可以通过一个活动拥有许多联系人 每个联系人电子邮件对都有自己独特的状态(状态1、状态2等) 每个状态(对于联系人电子邮件对)都有自己的用户 我不知道如何建模状态或用户。目前最紧迫的挑战是地位 (见下图) 下面的解决方案假定状态可以表示为字符串 class Campaign < ActiveRecord::Base has_many :

警告:我可能有错误的“问题陈述”,但它是这样的:

一场运动有很多联系人

竞选活动有很多电子邮件

因此,一个联系人通过一个活动有很多电子邮件

一封电子邮件可以通过一个活动拥有许多联系人

每个联系人电子邮件对都有自己独特的状态(状态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.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
联系人电子邮件的URL

/contacts/1/contact_emails/new #new
/contacts/1/contact_emails/2/edit #edit
URL没有电子邮件id。您可以将电子邮件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\u 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

那么ContactEmail是一种新的模型,它代表了一对联系人电子邮件?是的,ContactEmail就是这对。那么ContactEmail是否也需要有自己的属性,与电子邮件完全相同(但有mailmerged文本?),或者它只是一个占位符,电子邮件被发送,内容从未存储?:status=>:new是字符串“new”嗯…那它是嵌套循环吗?我如何创建一个新的,是新的联系人电子邮件(@contact,@email)?
def new
  @contact = Contact.find(params[:contact_id])
  @email   = Email.find(params[:email_id])
  @contact_email = @contact.contact_emails.build(:email => @email)
end
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