Связь «многие ко многим» с отдельными полями записи

#mysql #sql #ruby-on-rails

#mysql #sql #ruby-on-rails

Вопрос:

У меня есть таблица с именем email_messages. У меня есть столбцы from , to , cc , bcc . На данный момент они хранятся в виде текстовых полей, которые содержат сериализованные массивы адресов электронной почты. Но я хочу извлечь адреса в их собственную таблицу, чтобы я мог повторно использовать адреса и упростить поиск адресов с помощью typeahead.

Очевидно, мне нужно «многие ко многим». Но если я сделаю это:

 class EmailMessage
  has_many :email_message_addresses
  has_many :addresses, through: :email_message_addresses
end

class Address
  has_many :email_message_addresses
  has_many :email_messages, through: :email_message_addresses
end
  

Как я смогу связать адреса для каждого отдельного from to cc bcc поля для одной записи? from Поле может содержать 3 адреса, to поле может содержать 5 адресов и т.д.

Ответ №1:

Добавьте атрибут к вызываемому role email_message_addresses , который может принимать значения from , to , и т.д.

Вероятно, вам захочется добавить некоторые методы, чтобы вы могли выполнять следующий синтаксис

 @message = EmailMessage.find(...)
@message.to_addresses  # -> array of addresses in the "to" field
@message.cc_addresses  # -> array of addresses in the "cc" field
#  etc.
  

Комментарии:

1. Итак, для каждого сообщения электронной почты будет четыре адреса электронной почты (from, to, cc, bcc), и для каждого адреса электронной почты будет один или несколько адресов?

2. Нет. Если в данном сообщении есть 1 человек в поле «от», 2 человека в поле «кому», 3 в «cc» и «4» в bcc, тогда в таблице EmailMessageAddress будет 10 записей (1 2 3 4).