如何通过关联在has_many中通过关联在rails中执行has_many?

时间:2010-04-22 02:51:45

标签: ruby-on-rails ruby has-many-through

警告:我可能有错误的'问题陈述',但在这里:

广告系列包含多个联系人。

广告系列有很多电子邮件。

因此,联系人通过广告系列会收到许多电子邮件。

电子邮件可以通过广告系列获得多个联系人。

每个Contact-Email对都有自己独特的状态(status1,status2等)。

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

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

(见下图)

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

1 个答案:

答案 0 :(得分: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

该网址没有电子邮件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