Обратное проектирование (создание) таблиц или схемы базы данных из моделей и представлений в Ruby on Rails
Обновление: Вопрос все еще открыт, любые отзывы, комментарии всегда приветствуются
У меня есть существующий проект rails, в котором пропущены некоторые важные файлы и каталоги.
версия проекта rails (2.3.8) я нашел его в environment.rb
в настоящее время у меня есть
app
controllers (already fully coded)
helpers (already fully coded)
models (already fully coded)
reports (already fully coded)
views (already fully coded)
config ---> default configurations (already fully coded)
lib ---> contains nothing
public --> contains images and scripts (already fully coded)
script ---> contains server,runner,plugin,dbconsole....
Каталог приложения полностью содержит рабочее состояние кодов, приложение / модель содержит более 100 .rb файлов, поэтому я предполагаю, что это будет более 100 таблиц
в основном не хватает каталога db, файла.gem, файла rake, doc, test, vendor, базы данных,schema.rb и миграций
Примечание: у меня нет схемы таблицы и базы данных для этого проекта
Мне нужно сгенерировать таблицы или заполнить базу данных из моделей и представлений, и я ищу способ обратного инжиниринга для создания схемы БД из моделей или представлений
Я новичок в rails, и я из java. В java с помощью hibernate есть опция pojo (модель в rails) для базы данных, я ищу похожие вещи для rails, и моя главная цель - запустить этот проект. Так что, ребята, пожалуйста, помогите мне.
3 ответа
Чтобы воссоздать схему базы данных, потребуется немало времени.
Вы можете получить много информации о базе данных в каталоге app/models, app/controllers app/views.
Вы должны знать, что ActiveRecord не требует явного перечисления всех атрибутов модели. Это имеет важные последствия - вы можете только определить, какие атрибуты вам еще нужно добавить в базу данных, основываясь на том, на какой атрибут ссылается! Это значит, что делать это будет немного ИСКУССТВОМ. И нет никаких ЯСНЫХ шагов, чтобы закончить эту работу. Но ниже приведены некоторые правила, которые вы можете использовать, чтобы помочь вам.
Это БОЛЬШОЙ проект, ниже приведены рекомендации, правила и советы, которые могут вам помочь. Но имейте в виду, что это может занять много времени, и время от времени это разочаровывает.
Какие таблицы вам нужны:
Каждая таблица обычно имеет соответствующую модель ActiveRecord::Base. Поэтому в каталоге app / models проверьте каждый файл, и, если класс наследует от ActiveRecord::Base, это дополнительная таблица.
Имя таблицы по умолчанию является множественной версией названия класса в виде змеи.
class UserGroup < ActiveRecord::Base # for this class
имя таблицы - user_groups. Обратите внимание, что это множественное число, а вместо верблюжьего - строчный, с подчеркиванием для разделения слов.
Все эти таблицы будут иметь целочисленный столбец id. По умолчанию в таблицах также есть столбцы "create_at" и "updated_at" типа datetime.
Ассоциации и внешние ключи:
Вы можете определить, какие внешние ключи существуют ассоциациями в Моделях. Все ассоциации перечислены в явном виде, так что это не так уж сложно.
Например:
class UserGroup < ActiveRecord::Base # for this class
belongs_to :category
Это означает, что таблица user_groups имеет столбец с именем "category_id", который является внешним ключом для таблицы категорий.
Это означает, что модель Category, вероятно, имеет обратную связь (но без дополнительного столбца):
class Category < ActiveRecord::Base
has_many :user_groups
Основной другой ассоциацией является ассоциация has_many_and_belongs_to. Например.
class A < ActiveRecord::Base
has_and_belongs_to_many :bs
end
class B < ActiveRecord::Base
has_and_belongs_to_many :as
end
Это означает, что существует таблица для добавления, которая называется as_bs (так как и bs отсортированы в алфавитном порядке) с внешними ключами a_id и b_id.
Все внешние ключи являются целыми числами.
Атрибуты
Итак, это таблица ассоциаций. Теперь для нормальных атрибутов...
Вам следует проверить каталоги app/views/user_groups/ или другие подобные app / views.
Внутри вы найдете шаблоны просмотра. Вы должны взглянуть на шаблоны _form.html.erb (при условии, что это шаблоны.erb, в противном случае это могут быть шаблоны.haml и т. Д.).
Шаблон _form.html.erb, если он существует, обычно имеет многие атрибуты, перечисленные в качестве полей формы.
в form_for
блок, проверьте, если он говорит что-то вроде f.text_field :name
, это означает, что есть атрибут /(столбец в таблице), который называется "имя". Вы можете определить, какой тип столбца должен быть, по типу поля. Например. в данном случае это строка, поэтому, возможно, уместно использовать VARCHAR(255) (в Rails это называется строкой).
Вам также может потребоваться определить, какой тип подходит, основываясь на имени атрибута (например, если он упоминает что-то вроде:time, то он, вероятно, имеет тип Time или DateTime).
Это может дать вам все остальные атрибуты в таблице. Но в некоторых случаях вы можете пропустить атрибуты. Если вы найдете ссылку на другие атрибуты в контроллере, например. app/controllers/user_groups_controller.rb, тогда вы должны добавить это как столбец в вашей таблице. Вы можете оставить это до конца, когда будете тестировать его, потому что, когда вы тестируете его, если атрибут отсутствует, он выдаст ошибку NoMethodError для объекта соответствующей модели. Например. если говорится, что в переменной @user_group класса UserGroup отсутствует метод с именем title, то, вероятно, отсутствует столбец с именем "title" типа string.
Создайте заново свою миграцию / базу данных
Итак, теперь вы знаете, какими должны быть таблицы и имена и типы столбцов.
Вы должны сгенерировать / воссоздать миграцию для вашей базы данных.
Для этого просто используйте команду rails generate migration RecreateTables
,
Тогда вы должны найти файл в db/migrate/???_recreate_tables.rb
,
Внутри начните писать код ruby для создания своих таблиц. Ссылку на это можно найти по адресу http://guides.rubyonrails.org/migrations.html.
Но по сути у вас будет что-то вроде:
class RecreateTables < ActiveRecord::Migration
def up
create_table :user_groups do |t|
t.string :name # adds a string (VARCHAR) column called "name"
t.text :description # adds a textarea type column called "description
t.timestamps # adds both "created_at" and "updated_at" columns for you
end
end
def down
drop_table :products # this is the reverse commands to undo stuff in "up"
end
end
Чтобы воссоздать ваш Gemfile:
Начните с добавления Gemfile по умолчанию. Это можно сделать с помощью rails new testapplication
где-то создать пустое приложение рельсов. Затем скопируйте Gemfile в ваше реальное приложение. Это поможет вам начать с добавления рельсов и других драгоценных камней.
ОЧЕНЬ сложно понять, какие именно камни нужны. Лучшее, что вы можете сделать, это попробовать добавить их один за другим, просматривая код.
Опять же, здесь, MethodNotFound ошибки являются вашими друзьями. Когда вы тестируете приложение, основываясь на добавленных вами драгоценных камнях, оно может обнаружить некоторые отсутствующие методы, которые могут быть предоставлены драгоценными камнями. Некоторые отсутствующие методы в моделях могут указывать на отсутствующие драгоценные камни (или они могут указывать на отсутствующие поля / столбцы в базе данных). Однако отсутствующие методы в классах Controller или ActiveRelation ОЧЕНЬ вероятны из-за отсутствия драгоценных камней.
Вам нужно будет просмотреть код и попытаться определить, какие драгоценные камни добавить.
Если он использует такие методы, как can
, can?
и имеет файл app/models/ability.rb
тогда вам нужно gem 'cancan'
, Если это вызывает devise
в модели это нужно gem 'devise'
, Многие распространенные драгоценные камни можно увидеть на http://ruby-toolbox.com/.
После добавления драгоценных камней в ваш Gemfile, вы должны запустить bundle
в командной строке, чтобы установить новые гемы перед повторным тестированием. Когда вы протестируете это снова, вы должны перезапустить ваш тестовый сервер. повторный показ bundle exec rails server
запустить локальный тестовый сервер на localhost:3000
или что-то типа того.
Вы можете просто скопировать Rakefile с rails new testapp
и, вероятно, будет включать в себя все, что вам нужно.
Отсутствующие тесты
Отсутствующий каталог test / не относится к вашему фактическому приложению. Не требуется запускать приложение. Тем не менее, он содержит автоматические сценарии для тестирования вашего приложения. Вам нужно будет переписать новые тесты, если вы хотите автоматически протестировать ваше приложение. Однако в целях восстановления вашего приложения вы можете пока игнорировать его.
Отсутствует каталог поставщиков
Некоторый дополнительный код устанавливается не как драгоценный камень, а как плагин. Все, что установлено как плагин, теряется, если у вас нет каталога производителя. Как и в случае с драгоценными камнями, лучшее, что вы можете сделать, это попытаться определить, что может отсутствовать, и повторно загрузить отсутствующий плагин, либо переустановить плагин, либо использовать замену драгоценного камня.
Дополнительные советы:
Попробуйте прочитать некоторые комментарии, которые могут назвать некоторые из используемых драгоценных камней.
Если метод или набор методов отсутствуют, которые, по вашему мнению, не являются полями / столбцами базы данных, это может быть связано с отсутствием драгоценного камня. Лучшее, что можно сделать, - это поискать в Google имена этих методов. Например. если в нем отсутствует "paginate", вы можете найти "rails paginate gem" и посмотреть, какие драгоценные камни вам могут понадобиться. В этом примере, вероятно, появятся "will_paginate" и "kaminari". Затем вы должны попытаться определить, какие из драгоценных камней требуются. Может быть, сделать
grep will_paginate app -r
в командной строке, чтобы увидеть, если он использует, будет разбито на страницы. Команда grep ищет строку "will_paginate" в каталоге "app", -r заставляет делать это рекурсивно для всех файлов
Несмотря на то, что rails - это полнофункциональный веб-фреймворк, он будет работать без некоторых частей, если вы захотите,
Пример: в вашем случае
db - каталог для хранения миграций для создания ваших БД / таблиц, но если вы используете устаревшую БД или вещи базы данных обрабатываются администраторами БД, вы, возможно, этого не захотите. (вы можете просто подключиться к БД через файл database.yml)
Gem file помогает вам хранить все гемы (библиотеки) в одном месте, как вы это делаете с Maven (в Java)
test, опять же, если вы написали контрольные примеры (что является абсолютно плохой идеей), вам это нужно
vendor, для сторонних плагинов и doc для документации, так же применяется правило, если они вам нужны, вы можете их пропустить
Спящий режим в рельсах, называемый "Activerecord", та же концепция, модель связывается с таблицей базы данных (технически модель представляет собой необработанную таблицу)
Так что, если вы действительно хотите, чтобы они добавили их, а если нет, просто оставьте их
НО, я думаю, что наличие надлежащего файла Gem и тестовых случаев - необходимость
добро пожаловать в Rails
НТН
Далее я предполагаю, что вы уже знаете, как:
- выведите схему базы данных в файл SQL
- запустить консоль Rails (
rails c
) - создать миграцию Rails
Вот что я думаю тебе следует сделать.
Определите, какие из ваших классов соответствуют физическим таблицам (в вашем вопросе вы упомянули некоторые представления, что заставляет меня полагать, что подмножество ваших моделей привязано к представлениям базы данных вместо реальных таблиц). Для этого вам нужно сопоставить определения ваших моделей (классов, которые расширяют ActiveRecord::Base) до
CREATE TABLE
операторы в вашей схеме дамп. Например,class Person
в вашем коде Ruby соответствуетCREATE TABLE people
в дампе схемы вашей БД.После того, как вы определили эти модели (имена классов), вы запускаете консоль Rails, вводите имена этих моделей по одному и нажимаете Enter. Предполагается, что вывод консоли для модели Person будет выглядеть следующим образом:
>> Person
=> Person(id: integer, first_name: string, last_name: string)
Затем вы берете то, что в скобках, лишить ведущий id: integer,
, избавьтесь от запятых, избавьтесь от этих пробелов после двоеточий, получив таким образом что-то вроде этого:
first_name:string last_name:string
Сделав это, команда для генерации миграции будет выглядеть так:
rails g migration Person first_name:string last_name:string
Затем вы запускаете новый проект Rails где-то еще, выполняете все эти миграции и проверяете содержимое db/migrate
, Ваши миграции, скорее всего, выполнены на 90%, и вам все равно нужно заменить некоторые экземпляры t.integer
с t.references
и другие мелкие вещи, которые полностью зависят от предметной области и которые невозможно отразить в общем ответе.
НТН.