Как правильно сохранить отношения из contains_to в has_one в Rails

У меня есть приложение rails с двумя отдельными моделями с двумя отдельными представлениями, называемыми Office и Prospect.

Модель офиса:

class Office < ActiveRecord::Base
  has_one :prospect
end

Перспективная модель:

class Prospect < ActiveRecord::Base
  belongs_to :office

  def office_company
    office.try(:company)
  end

  def office_date
    office.try(:office_date)
  end

  def office_company=(company)
    self.office = Office.find_or_create_by(company: company)
  end

  def office_date=(office_date)
    self.office = Office.find_or_create_by(office_date: office_date)
  end
end

В таблице Prospect есть ключ office_id.

Представление формы перспективы:

  <!-- Date -->
  <div class="row form-box-outline">
    <div class="form-subheader">Date</div>
    <div class="form-group">
      <%= f.label :Office_Date %>
      <%= f.text_field :office_date, class: "space form-control input-width",
                       'data-provide' => 'datepicker', 'data-date-format' => 'yyyy-mm-dd',
                       'data-date-today-highlight' => 'true', 'data-date-orientation' => 'bottom auto',
                       'data-date-today-btn' => 'linked', 'data-date-autoclose' => 'true',
                       'data-date-keyboard-navigation' => 'false' %>
    </div>
  </div>


  <!-- Prospect Information -->
  <div class="row form-box-outline">
    <div class="form-subheader subform-box-outline">Prospect Information</div>
    <div class="subform-box-outline">
      <div class="form-group ">
        <%= f.label :Company, "Account Prospect" %>
        <%= f.text_field :office_company, class: 'space form-control' %>
      </div>
    </div>

При создании нового потенциального клиента мне нужен доступ к полю компании и полю даты (а в будущем, возможно, еще к одному или двум полям) в модели Office, что не является проблемой для определенных методов, которые я написал. Проблема возникает, когда я сохраняю новую перспективу, в модели Office сохраняются две записи базы данных. Одна запись с клиентом и одна на дату. В модели потенциального клиента сохранена одна запись: одна с информацией о потенциальном клиенте и ключом office_id. Я считаю, что это происходит потому, что два объекта создаются, а затем сохраняются.

  1. Каков наилучший способ объединить мои методы, чтобы я всегда создавал одну запись для каждого создания и обновления в своем представлении формы?

  2. Является ли отношение has_one author_to лучшим способом сделать это? Я чувствую некоторое сопротивление, что это не лучшая практика или путь Rails.

  3. Я уже пробовал это с использованием вложенных атрибутов, но обнаружил, что каждый раз, когда создавалась запись, представление редактирования потенциального клиента было пустым с компанией и датой, даже если запись существовала в таблице Office и присутствовал ключ office_id.

  4. Проспект — это возможный будущий офис, но не активный (клиентский) офис. Офис может быть активным, предполагаемым или неактивным. Я хочу, чтобы пользователь мог легко переместить потенциального клиента в (активный) офис (это задается с помощью раскрывающегося списка во время создания потенциального клиента или офиса), а не создавать потенциального клиента с отдельным названием компании.

  5. Таблицы Prospect и Office содержат очень разную информацию, но имеют несколько общих полей (компания, дата, статус, пользователь). Офисная таблица содержит всю информацию о компании (название компании, адрес и т.д.). Таблица потенциальных клиентов содержит маркетинговые материалы, относящиеся к этому офису. Я хотел, чтобы у Prospects был отдельный контроллер представления и модель, чтобы их можно было отличить от Office.


person bradbajuz    schedule 18.02.2016    source источник


Ответы (1)


Я бы предпочел использовать поле выбора и передать массив офисов. Нет смысла сохранять идентификатор офиса и отображать компанию. Пока ваш office_id отправляется в качестве параметра в контроллере, он сохраняет идентификатор, а отношение, определенное в модели, будет обрабатывать отношение активной записи.

Я думаю, это то, что вам нужно. Я бы воздержался от создания двух записей в разных таблицах.

person Andrew_tainton    schedule 19.02.2016
comment
Я пытаюсь предотвратить сохранение двух записей в таблице Office. Происходит следующее: поля company и office_date сохраняются из Prospects как отдельные записи в таблице Office. Я хочу сохранить одну запись, включающую поля company и office_date в таблице Office. - person bradbajuz; 19.02.2016
comment
Я понимаю вашу точку зрения об использовании поля выбора вместо поля. Вы выделили отдельную проблему с тем, что я пытаюсь сделать. - person bradbajuz; 19.02.2016