Автоматическое создание моделей из таблиц в Ruby on Rails 3

// Ноябрь 26th, 2010 // Ruby, Ruby on Rails, Веб-разработка

Очень часто бывает ситуация, когда имеется готовая структура БД, и необходимо сделать модели на её основе. Если таблиц 10, то это не проблема, а если больше, и они большие по структуре? Импорт можно сделать буквально за 5 минут!

На данный момент есть несколько методик, которые позволяют импортировать структуру из бд. Они делятся на два типа:

1. Создают модели «на-лету»: acts_as_importable plugin

2. Генерируют модели: Trucker, Использование ActiveRecord, Legacy_data

Я попробовал использовать Legacy_data. Итак, что нужно сделать для генерации моделей в Rails 3 приложении.

Создаем приложение

rails new myapp -d=mysql

cd ./myapp

Редактируем файл ./config/database.yml, в котором запишем реквизиты доступа к БД.

В файле ./Gemfile добавим следующую строчку:

gem 'legacy_data', :git => 'git://github.com/alexrithenberg/legacy_data.git'

Т.к. Rails 3 поддерживает только версия 0.2.0 legacy_data, которой нет на rubygems.

Качаем гемы:

bundle install

И генерируем модели:

rails generate models_from_tables

Я натравил его на базу с PhpMyAdmin, таблицы были проанализированы.

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.

Модели к сожалению не создались, из-за ошибки:

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. А вот полный лог того, что надо сделать:

andrey@vaio:~/Ruby$ rails new my -d=mysql
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$ sudo rails generate models_from_tables
Could not find generator models_from_tables.
Затем в Gemfile приложения добавляем строчку gem 'legacy_data'andrey@vaio:~/Ruby/my$ sudo bundle install
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$ sudo 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.
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 <enter> 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!

Share

Спасибо!


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


3 Responses to “Автоматическое создание моделей из таблиц в Ruby on Rails 3”

  1. kaineer:

    В адресе репозитария
    s/alexrithenberg/alexrothenberg/

  2. google.com Андрей Токарчук:

    Автор вновб обновил legacy_data. Теперь исправлен баг «can’t convert String into Integer (TypeError)»!

Комментировать