Удалить поле базы данных при удалении свойства из класса с помощью datamapper - PullRequest
0 голосов
/ 19 февраля 2012

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

DataMapper.finalize.auto_upgrade!

для обработки миграций.У меня было два Класса (Художники и События) с ассоциацией has_n и own_to.Событие «принадлежало_ одному» одному исполнителю и одному исполнителю может иметь много связанных с ним событий.

Я изменил ассоциацию на отношение many_to_many, удалив предыдущие части определения класса, которые управляли исходной ассоциацией one_to_many вмодели и добавление

has n, :artists, :through => Resource

в класс Event и соответствующий код в класс Artist.Когда я создаю новое событие, возникает ошибка.

#<DataObjects::IntegrityError: events.artist_id may not be NULL

Поле: artist_id является реликтом исходной связи между двумя классами.Event.artists [i] получает доступ к новой ассоциации many_to_many (где 'i' - просто целочисленный индекс, идущий от 0 до числа связанных исполнителей -1).Видимо, оригинальный метод связи между классами Artist и Event все еще существует?Я думаю, что решение этой проблемы состоит не в том, чтобы использовать не только метод auto_upgrade, встроенный в datamapper, но и писать явную миграцию.Если есть способ обработать изменения такого типа в базе данных и при этом работает метод auto_upgrade, это было бы здорово!

Если вам нужны подробности о моих моделях или что-нибудь еще, пожалуйста, спросите, и я с удовольствиемдобавить их.

Ответы [ 2 ]

1 голос
/ 19 февраля 2012

По моему опыту, DataMapper auto_upgrade работает не очень хорошо - или, по меньшей мере, он не работает так, как я ожидаю. Если вы хотите добавить новый столбец в вашу модель, он будет делать то, что должен; попытайтесь сделать что-нибудь более сложное для столбца, и он, вероятно, не будет вести себя так, как вы ожидаете.

Например, если вы создаете свойство типа String, оно изначально будет иметь длину 50 символов. Если вы заметили, что для хранения строки недостаточно 50 символов, добавление :length => 100 к модели будет недостаточным для auto_upgrade изменения ширины столбца.

Кажется, вы наткнулись на другой недостаток, хотя можно утверждать, что, в вашем случае, возможно, поведение DataMapper не так уж плохо (вспомните устаревшие базы данных). Но дело в том, что при изменении ассоциации столбец Event artist_id не был удален, а затем при попытке сохранить Event вы получите сообщение об ошибке, поскольку база данных сообщает об этом это обязательное поле.

Обратите внимание, что ошибка, которую вы получаете, не является ошибкой проверки: DataMapper думает, что все выглядит нормально, но при попытке сохранить объект выдает ошибку из базы данных.

Надеюсь, это поможет!

0 голосов
/ 11 апреля 2012

Автообновление не является недостатком вообще!Я считаю автообновление удобной функцией DataMapper.Насколько я знаю, единственная цель - добавить для вас столбцы.Так что это отлично подходит для быстрого запуска проекта и управления средами тестирования и разработки без необходимости написания миграций, но не лучшим инструментом для внесения изменений в зрелый, работающий проект.

Для этого DataMapper действительно имеетмиграция!Используйте гем dm-migrations.Недостатком является то, что они не очень хорошо задокументированы ... вообще.На самом деле я работаю над тем, чтобы изменить текущий проект на использование миграций, и я надеюсь внести некоторые инструкции в вики dh-migrations github.Но если вы не готовы перейти к миграции, вы также можете просто обновить столбцы вручную с помощью клиента SQL, а затем продолжить использовать автоматическое обновление для новых столбцов.Это то, чем я занимаюсь 2 года на моем проекте:)

...