Обновление данных Relation Active Record

Хочется услышать пару советов от профессионалов: Есть список компаний в БД, у каждой компании несколько номеров телефонов (отношение MANY_MANY, через дополнительную таблицу). Вывод работает прекрасно, а вот на create и update записей я немного застрял. Интуитивно понимаю, что придется использовать табличный ввод (форма с кнопками динамическими полями "добавить еще телефон"). Динамические поля в таком контексте делаю впервые. Может быть у кого-нибудь есть примеры или мануалы по реализации такой фичи?

Вот как я в свое время решал подобную проблему.

  1. В модель телефона добавил дополнительное свойство status, которое может принимать одно их трех значений(new,updated,deleted).

  2. В модель компании добавил дополнительное свойсто phones, которое хранит массив телефонов с которыми мы работаем.

  3. При создании модели компании, в свойство phones копируем все телефоны которые уже есть.

  4. Вывод телефонов на страницу делаем с помощью tabular input(изначально для всех телефонов считаем status = ‘’). Сохранение телефонов в phone делаем так же.

  5. js на клиентской стороне занимается добавлением и удалением телефонов. при добавлении добавляет форму для ввода данных со status = new, при удалении делает просто форму невидимой и делает status = deleted.

  6. при сохранении удаляем все телефоны, у которых status = deleted, добавляем те, у которых status = new, обновляем те, у которых статус = updated.

В принципе по коду получается довольно немного. Надеюсь, что понятно обьяснил.

Прошу прощения за вопрос, но разве один телефон может соответствовать сразу нескольким компаниям? :) Первое отношение, которое приходит в голову - Company HAS_MANY PhoneNumber.

Я бы сначала сделал добавление компании. Потом на отдельной странице (следующем шаге), когда запись в базе появилась и нам известен её id, делать добавление телефонов средствами AJAX. Т.е. при клике на ссылку “добавить” выползает окошечко с инпутом и кнопкой, нажав на которую серверу отправляется обычный запрос на добавление одного телефона (а это делается просто). В итоге получаем даже еще более удобный интерфейс, прозрачную логику и исключение ситуаций, когда пользователь вводит 10 телефонов, у него что-то заглючивает, данные не сохраняются и приходится делать всё заново :)

Я бы не сказал, что тот интерфейс, который Вы описали более удобный. В моем случае имеется одна форма, в которой телефоны добавляются нажатием на одну кнопку, удаляются нажатием на одну кнопку. И если человек ввел какие-то данные неверно все заново делать не надо. У него все поля в форме останутся заполненными, и будут отмечены те поля, где данные невалидны/отсутствуют.

само собой, это зависит от задачи, просто может мысль пригодится на будущее :)

Если телефоны вводятся разом и удаляются разом, то делаем textarea и каждый телефон в своей строчке, никаких проблем :))