Автоматическое создание моделей из таблиц в Ruby on Rails 3
Очень часто бывает ситуация, когда имеется готовая структура БД, и необходимо сделать модели на её основе. Если таблиц 10, то это не проблема, а если больше, и они большие по структуре? Импорт можно сделать буквально за 5 минут!
На данный момент есть несколько методик, которые позволяют импортировать структуру из бд. Они делятся на два типа:
1. Создают модели “на-лету”: acts_as_importable plugin
2. Генерируют модели: Trucker, Использование ActiveRecord, Legacy_data
Я попробовал использовать Legacy_data. Итак, что нужно сделать для генерации моделей в Rails 3 приложении.
Создаем приложение
1 2 3 |
rails new myapp -d=mysql cd ./myapp |
Редактируем файл ./config/database.yml, в котором запишем реквизиты доступа к БД.
В файле ./Gemfile добавим следующую строчку:
1 |
gem 'legacy_data', :git => 'git://github.com/alexrithenberg/legacy_data.git' |
Т.к. Rails 3 поддерживает только версия 0.2.0 legacy_data, которой нет на rubygems.
Качаем гемы:
1 |
bundle install |
И генерируем модели:
1 |
rails generate models_from_tables |
Я натравил его на базу с PhpMyAdmin, таблицы были проанализированы.
1 2 3 4 5 6 7 8 9 10 11 |
rails generate models_from_tables analyzing pma_bookmark => PmaBookmark analyzing pma_column_info => PmaColumnInfo analyzing pma_designer_coords => PmaDesignerCoord analyzing pma_history => PmaHistory analyzing pma_pdf_pages => PmaPdfPage analyzing pma_relation => PmaRelation analyzing pma_table_coords => PmaTableCoord analyzing pma_table_info => PmaTableInfo analyzing pma_tracking => PmaTracking Done analyzing the tables. |
Модели к сожалению не создались, из-за ошибки:
1 2 3 |
create app/models/pma_bookmark.rb /var/lib/gems/1.8/bundler/gems/legacy_data-e64935f75769/lib/generators/models_from_tables/models_from_tables_generator.rb:42:in `initialize': No such file or directory - /home/andrey/Ruby/myapp/spec/factories.rb (Errno::ENOENT) |
Наверное, придется использовать rails 2.3 и lagacy_data 0.1.1 или ждать, когда автор исправит баги.
UPD: от автора поступил ответ по этому багу:
I’m still working on the 0.2.0 version with Rails 3 and as you have figured out its not quite ready. The specs are all passing but it doesn’t quite work when used as a generator inside a real rails project. I hope to get that working soon and will leave this issue open until I do.
Sorry for the inconvenience.
UPD: Автор по моей просьбе исправил багу, и выпустил версию 0.2.0 legacy_data. После обновления всё заработало. Сгенерированный модели можете посмотреть здесь: models-legacy-data-generated. А вот полный лог того, что надо сделать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
andrey@vaio:~/Ruby$ <strong>rails new my -d=mysql</strong> create create README create Rakefile create config.ru create .gitignore create Gemfile create app create app/controllers/application_controller.rb create app/helpers/application_helper.rb create app/mailers create app/models create app/views/layouts/application.html.erb create config create config/routes.rb create config/application.rb create config/environment.rb create config/environments create config/environments/development.rb create config/environments/production.rb create config/environments/test.rb create config/initializers create config/initializers/backtrace_silencers.rb create config/initializers/inflections.rb create config/initializers/mime_types.rb create config/initializers/secret_token.rb create config/initializers/session_store.rb create config/locales create config/locales/en.yml create config/boot.rb create config/database.yml create db create db/seeds.rb create doc create doc/README_FOR_APP create lib create lib/tasks create lib/tasks/.gitkeep create log create log/server.log create log/production.log create log/development.log create log/test.log create public create public/404.html create public/422.html create public/500.html create public/favicon.ico create public/index.html create public/robots.txt create public/images create public/images/rails.png create public/stylesheets create public/stylesheets/.gitkeep create public/javascripts create public/javascripts/application.js create public/javascripts/controls.js create public/javascripts/dragdrop.js create public/javascripts/effects.js create public/javascripts/prototype.js create public/javascripts/rails.js create script create script/rails create test create test/fixtures create test/functional create test/integration create test/performance/browsing_test.rb create test/test_helper.rb create test/unit create tmp create tmp/sessions create tmp/sockets create tmp/cache create tmp/pids create vendor/plugins create vendor/plugins/.gitkeep andrey@vaio:~/Ruby$ andrey@vaio:~/Ruby$ mc andrey@vaio:~/Ruby/my$ <strong>sudo rails generate models_from_tables</strong> Could not find generator models_from_tables. <strong>Затем в Gemfile приложения добавляем строчку gem 'legacy_data'</strong>andrey@vaio:~/Ruby/my$ <strong>sudo bundle install</strong> Fetching source index for http://rubygems.org/ Using rake (0.8.7) Using abstract (1.0.0) Using activesupport (3.0.1) Using builder (2.1.2) Using i18n (0.4.2) Using activemodel (3.0.1) Using erubis (2.6.6) Using rack (1.2.1) Using rack-mount (0.6.13) Using rack-test (0.5.6) Using tzinfo (0.3.23) Using actionpack (3.0.1) Using mime-types (1.16) Using polyglot (0.3.1) Using treetop (1.4.9) Using mail (2.2.10) Using actionmailer (3.0.1) Using arel (1.0.1) Using activerecord (3.0.1) Using activeresource (3.0.1) Using bundler (1.0.3) Using foreigner (0.9.1) Using thor (0.14.6) Using railties (3.0.1) Installing legacy_data (0.2.0) Using mysql2 (0.2.6) Using rails (3.0.1) Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed. andrey@vaio:~/Ruby/my$ <strong>sudo rails generate models_from_tables</strong> analyzing pma_bookmark => PmaBookmark analyzing pma_column_info => PmaColumnInfo analyzing pma_designer_coords => PmaDesignerCoord analyzing pma_history => PmaHistory analyzing pma_pdf_pages => PmaPdfPage analyzing pma_relation => PmaRelation analyzing pma_table_coords => PmaTableCoord analyzing pma_table_info => PmaTableInfo analyzing pma_tracking => PmaTracking Done analyzing the tables. Automatic class names written to '/home/andrey/Ruby/my/app/models/table_mappings.yml' Since the database probably does not follow Rails naming conventions you should take a look at the class names and update them in that file. Once you're done hit <strong><enter></strong> to continue generating the models" create app/models/pma_bookmark.rb create app/models/pma_column_info.rb create app/models/pma_designer_coord.rb create app/models/pma_history.rb create app/models/pma_pdf_page.rb create app/models/pma_relation.rb create app/models/pma_table_coord.rb create app/models/pma_table_info.rb create app/models/pma_tracking.rb andrey@vaio:~/Ruby/my$ |
Так что теперь legacy_data работает с Rails 3!
В адресе репозитария
s/alexrithenberg/alexrothenberg/
Эм, вот на этой странице https://github.com/alexrothenberg/legacy_data есть правильная ссылка. Вроде у меня такая же.
Автор вновб обновил legacy_data. Теперь исправлен баг “can’t convert String into Integer (TypeError)”!