Как я могу сделать has_many через ассоциацию на has_many через ассоциацию в рельсах? - PullRequest
0 голосов
/ 22 апреля 2010

Предупреждение: у меня может быть неправильное «постановка проблемы», но здесь это так:

Кампания имеет много контактов.

Кампания имеет много электронных писем.

Таким образом, контакт имеет много электронных писем в рамках кампании.

А электронная почта может иметь много контактов через кампанию.

Каждая пара «контакт-электронная почта» имеет свой уникальный статус (status1, status2 и т. Д.).

Каждый статус (для пары «Контакт-электронная почта») будет иметь своего собственного пользователя.

Я не знаю, как смоделировать статус или пользователя. В настоящее время непосредственным вызовом является статус.

(см. Схему ниже)

альтернативный текст http://img88.imageshack.us/img88/7086/statusassociations.png

1 Ответ

0 голосов
/ 22 апреля 2010

В приведенном ниже решении предполагается, что статус может быть представлен в виде строки.

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"
    }
  ]
)

Изменить 2 Вложенные ресурсы для ContactEmail.

map.resources :contacts, has_many :contact_emails

URL-адрес для ContactEmail

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

URL-адрес неесть идентификатор электронной почты.Вы можете передать 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
...