如何在 Rails 中通过关联对 has_many 进行关联?

发布于 2024-08-29 10:21:42 字数 428 浏览 4 评论 0原文

警告:我可能有错误的“问题陈述”,但事实是:

一个营销活动有很多联系人。

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

因此,一个联系人通过一个营销活动拥有许多电子邮件。

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

每个联系人-电子邮件对都有其自己唯一的状态(状态 1、状态 2 等)。

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

我不知道如何对状态或用户进行建模。目前最直接的挑战是地位。

(见下图)

替代文本

Warning: I may have the wrong 'problem statement' but here it goes:

A Campaign has many Contacts.

A Campaign has many Emails.

Therefore, a Contact has many Emails through a Campaign.

And an Email can have many Contacts through a Campaign.

Each Contact-Email pair has its own unique Status (status1, status2, etc).

Each Status (for a Contact-Email pair) will have its own User.

I do not know how to model Status, or User. Currently the immediate challenge is Status.

(see diagram below)

alt text

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

平生欢 2024-09-05 10:21:42

下面的解决方案假设状态可以表示为字符串。

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

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

Solution below is assuming that status can be represented as a string.

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

Adding emails to contact:

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

OR create multiple:

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

Edit 2
Nested resources for ContactEmail.

map.resources :contacts, has_many :contact_emails

URL for ContactEmail

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

The URL does not have the email id. You can pass the email_id as a query parameter, i.e.

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

In your ContactEmailsController:

def new
  @contact = Contact.find(params[:contact_id])
  @email   = Email.find(params[:email_id])
  @contact_email = @contact.contact_emails.build(:email => @email)
end

In your view set email_id as hidden field.

In the create method perform the save.

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文