Вот что бы я сделал:
Создайте миграцию, чтобы изменить имя таблицы (уровень базы данных). Полагаю, ваш старый стол называется корпусом . Содержание миграции будет:
class RenameCorpsToStores < ActiveRecord::Migration
def change
rename_table :corps, :stores
end
end
Измените имя файла модели, определение класса модели и ассоциации модели:
- Переименование файла:
corp.rb
->store.rb
- Код
store.rb
: Изменить class Corp
дляclass Store
- Переименуйте все ассоциации модели как
has_many :corps
->has_many :stores
Измените имя файла контроллера и определение класса контроллера:
- Переименование файла:
corps_controller.rb
->stores_controller.rb
- Код
stores_controller.rb
: Изменить class CorpsController
дляclass StoresController
Переименовать папки просмотра. От corps
до stores
.
Внесите необходимые изменения в пути в config/routes.rb
файле, например resources :corps
-> resources :stores
, и убедитесь, что все ссылки в коде меняются с корпуса на хранилища (corps_path, ...)
Не забудьте запустить миграцию :)
Если предыдущее невозможно, попробуйте удалить db / schema.rb и выполнить:
$ rake db:drop db:create db:migrate
find -name "oldname_on_singular?*
за списком файлов, которые нужно переименовать. Затем я копирую его на calc, вставляю два раза во второй и третий столбцы. В первом столбце я добавляю команду переименования, а в последнем столбце я меняю на новое имя, например:git mv ./spec/views/oldname ./spec/views/new name
rake db:drop
супер опасно! Я бы рекомендовал вам удалить эту строку, чтобы изменить ее на «rake db: migrate»! Люди имеют тенденцию копировать-вставить и запустить!В дополнении к Nobita ответа вы так же необходимо изменить тест и вспомогательные определения классов & имена файлов
corps
вstore
. Что еще более важно, вы должны изменитьcorps
наstore
в своем конфигурации / routes.rb файлТаким образом, вы вносите изменения в Контроллер, связанные файлы Модели, Представлений, Помощников, Тестов и Маршрутов.
Я думаю, что то, что вы видели с помощью
destroy
&,generate
является лучшим вариантом. Я дал ответ, как это сделать здесь: Rails: переименование контроллера и соответствующей моделиисточник
Вы также можете попробовать гем Rails Refactor , инструмент командной строки для простых рефакторингов, таких как переименование модели и контроллера для проектов Rails.
Применение:
источник
В дополнение к ответу Нобиты (который я бы прокомментировал, если бы у меня было достаточно репутации), если вы чувствуете себя смелым, то изменения имен файлов и ссылок на модель в вашем коде можно несколько автоматизировать. Например, чтобы изменить ссылки в вашем коде, вы можете использовать
Единственное число, минус и майус:
grep -rl corp | xargs sed -i 's/corp/store/g' grep -rl Corp | xargs sed -i 's/Corp/Store/g'
Множественное число, минус и майус (единственное число заменяет множественное число, если во множественном числе нужен только символ s в конце):
grep -rl corps | xargs sed -i 's/corps/stores/g' grep -rl Corps | xargs sed -i 's/Corps/Stores/g'
Переименовать файлы:
find . -name '*corp*' -exec bash -c 'mv $0 ${0/corp/store}' {} \;
А в некоторых вариантах * nix (включая Slackware) есть утилита rename, которая поможет вам переименовать файлы:
shopt -s globstar rename -v corps stores app/**/*corps* config/**/*corps* test/**/*corps*
Проверьте, что переименование - это то, что вы думаете, хотя я знал, что другие дистрибутивы, такие как Ubuntu, поставляются с другой утилитой с тем же именем (см. Https://unix.stackexchange.com/questions/78621/find-rename-command- не работает ). В Ubuntu вы бы сделали это вместо этого:
shopt -s globstar rename -v 's/corps/stores/' app/**/*corps* config/**/*corps* test/**/*corps*
Обратите внимание, что вы не хотите переименовывать любые файлы в db /, за исключением, возможно, вашего файла seed.rb, поэтому вы, вероятно, захотите исключить этот каталог и внести любые изменения вручную.
источник
Еще одна важная вещь заключается в том, что вам необходимо обновить ассоциации модели, что вам придется делать независимо от того, переименовываете ли вы вручную или уничтожаете и генерируете ресурс (поскольку они существуют в других моделях). Вы можете запустить миграцию, чтобы изменить имена столбцов внешних ключей в базе данных и изменить все ссылки на эти внешние ключи в коде:
rename_column :table, :old_id, :new_id
или установите настраиваемый внешний ключ при объявлении ассоциации, которая использует старый внешний ключ:
belongs_to :new, foreign_key: "old_id"
Также, если ваш ресурс включает изображения, они часто хранятся в каталоге, который включает имя ресурса, но (по крайней мере, с carrierwave) после изменения имени ресурса на них будут ссылаться некорректно (файл существует в '/ uploads / old / image / 1 / pic.jpg ', но ищется в' uploads / new / ... '), поэтому вам придется либо удалить и повторно загрузить изображения, либо переместить их на новый путь, либо, возможно, изменить место, где они' повторно ищут.
источник
А если у вас есть модельные тесты, вам нужно изменить:
Переименование файла: corp_test.rb -> store_test.rb (также для тестов контроллера, интеграционных тестов, фикстур и т. Д.)
Код store_test.rb: изменить класс CorpTest на класс StoreTest.
И все ссылки корпорации в тестах контроллера, модели, интеграции, приспособлений.
источник
Для человека, который только что завершил этот болезненный процесс, НАИБОЛЕЕ важным шагом является создание достаточного количества ТЕСТОВ. чтобы проверить как можно больше функциональности. Они должны охватывать не только модель / контроллер, которые вы планируете переименовать, но и все другие части моделей / контроллеров / представлений. В любом случае это хорошая (а может быть, даже необходимость) практика.
Выполняйте эти шаги итерациями, иногда вам нужно вернуться к шагам несколько раз (5 и более), чтобы обнаружить дополнительные файлы, которые необходимо изменить. А теперь о шагах переименования:
Corps/Corp
вStores/Store
вdb/migrate
папкеПопробуйте запустить:
rake db: drop: all
rake db: create
rake db: миграция
Измените содержимое
db/seeds.rb
файла.rake db:seed --trace
(На этом этапе вам может потребоваться изменить некоторые другие файлы модели / контроллера.)test/fixtures
файлы. вам может потребоваться изменить не только corps.yml, но и другие связанные файлы (некоторые файлы могут включать corp_id).TESTOPTS="--seed=1981"
или любое другое число)источник
для контроллера вам придется внести изменения в следующих местах, если вы делаете это вручную :
для модели ответ Нобиты неплохой
источник