从Ruby on Rails中的模型和视图逆向工程(生成)表或数据库模式

时间:2012-07-31 14:03:24

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2 ruby-on-rails-2

更新:问题仍未解决,欢迎任何评论,评论

我正在使用现有的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....

app目录完全包含代码的工作状态,app / model包含100多个.rb文件,所以我假设它将超过100个表

主要缺少的是 db目录,.gem文件,rake文件,doc,test,vendor,database,schema.rb和migrations

注意:   我没有该项目的表架构和数据库

我需要从模型和视图生成表或完成数据库 我正在寻找逆向工程类型的东西,用于从模型或视图生成数据库模式

我是rails的新手,我来自java背景,在java中使用hibernate有一个pojo(模型在rails中)可用数据库选项,我正在寻找类似的东西用于rails,我的主要目标是运行那个项目,所以大家请帮助我。

3 个答案:

答案 0 :(得分:3)

要重新创建数据库架构,需要花费相当多的时间。

您可以在app / models,app / controllers app / views目录中获取有关数据库的大量信息。

您应该知道ActiveRecord 要求您明确列出模型的所有属性。这具有重要意义 - 根据是否引用属性,您只能推断您仍需要添加到数据库的属性!这意味着这样做会有点艺术性。并且没有CLEAR步骤来完成这项工作。但是下面是一些可以用来帮助你的规则。

这是一个大项目,下面是帮助您的指南,规则和提示。但请注意,这可能需要时间,而且令人沮丧有时会完成此操作。


您需要什么表:

每个表通常都有匹配的 ActiveRecord :: Base 模型。所以在app / models目录中,检查每个文件,如果该类继承自ActiveRecord :: Base,则它是一个额外的表。

默认情况下,表名是类的名称的复数蛇案例版本。

class UserGroup < ActiveRecord::Base # for this class

表的名称是user_groups。注意它是复数,而不是驼峰的情况,它是小写的,用下划线来分隔单词。

所有这些表格都有一个&#34; id&#34;整数列。默认情况下,表格还包含&#34; created_at&#34;和&#34; updated_at&#34; datetime类型的列。

关联和外键:

您可以通过模型中的关联推断出存在哪些外键。所有关联都是明确列出的,所以这不太难。

例如:

class UserGroup < ActiveRecord::Base # for this class
  belongs_to :category

这意味着user_groups表有一个名为&#34; category_id&#34;的列,它是类别表的外键。

这意味着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

这意味着有一个连接表要添加名为&#34; as_bs&#34; (as和bs按字母顺序排序),使用外键&#34; a_id&#34;和&#34; b_id&#34;。

所有外键都是整数。


属性

好的,这就是表格关联。现在是正常的属性......

您应该检查 app / views / user_groups / 或其他类似的 app / views 目录。

在里面你会找到视图模板。您应该查看_form.html.erb模板(假设它是.erb模板,否则它可能是.haml等模板)。

_form.html.erb模板(如果存在)通常会将许多属性列为表单字段。

form_for块中,检查它是否显示f.text_field :name之类的内容,这意味着有一个名为&#34; name&#34;的属性/(表中的列)。您可以根据字段的类型推断列的类型。例如。在这种情况下,它是一个字符串,所以也许VARCHAR(255)是合适的(在Rails中称为字符串)。

您可能还需要根据属性的名称推断出适合的类型(例如,如果它提到类似:时间,那么它可能是Time或DateTime类型)。

这可能会为您提供表格中的所有其他属性。但在某些情况下,您可能会错过这些属性。如果您在控制器中找到对其他属性的引用,例如。 app / controllers / user_groups_controller.rb,然后您应该将其添加为表格中的列。您可以将它保留到测试结束时,因为当您测试它时,如果缺少某个属性,那么它将为相关模型的对象抛出NoMethodError。例如。如果它说UserGroup类的@user_group变量缺少一个名为title的方法,那么它可能缺少一个名为&#34; title&#34;的列。类型字符串。


重新创建迁移/数据库

好的,现在您知道数据库表和列名称和类型应该是什么。

您应该为数据库生成/重新创建迁移。

要执行此操作,只需使用命令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来创建空rails应用程序来完成。然后将Gemfile复制到您的实际应用程序。它将帮助您开始使用rails和其他常见宝石。

很难确切地知道需要什么宝石。您可以做的最好的事情是在查看代码时尝试逐个添加它们。

同样,在这里,MethodNotFound错误是你的朋友。在测试应用程序时,根据您添加的gem,它可能会检测到某些可能由gem提供的缺失方法。模型上的一些缺失方法可能表示缺少宝石(或者它们可能表示数据库中缺少字段/列)。但是,由于缺少宝石,很可能缺少Controller或ActiveRelation类的方法。

您必须查看代码并尝试推断要添加的宝石。

如果它使用cancan?等方法,并且文件为app/models/ability.rb,那么您需要gem 'cancan'。如果它在模型中调用devise,则需要gem 'devise'。在http://ruby-toolbox.com可以看到许多常见的宝石。

将Gems添加到Gemfile后,您应该在命令行上运行bundle以在再次测试之前安装新的gem。再次测试时,应重新启动测试服务器。重新运行bundle exec rails server以在localhost:3000或类似内容上启动本地测试服务器。

您可以简单地从rails new testapp复制Rakefile,可能包含您需要的所有内容。

缺少测试

缺少的测试/目录与您的实际应用程序无关。不需要运行该应用程序。但是,它确实包含自动脚本来测试您的应用程序。如果要自动测试应用程序,则必须重新编写新测试。但是,为了恢复您的应用程序,您现在可以忽略它。

缺少供应商目录

一些额外的代码不作为gem安装,而是作为插件安装。如果您没有供应商目录,任何作为插件安装的内容都将丢失。与宝石一样,您可以做的最好的事情是尝试推断可能缺少的内容,并重新下载丢失的插件,重新安装插件或使用宝石替换。


其他提示:

  • 尝试阅读一些可能会使用某些宝石的评论。

  • 如果缺少一个方法或一组方法,您认为不是数据库字段/列,则可能是由于缺少gem。最好的办法是搜索谷歌的方法名称。例如。如果缺少&#34; paginate&#34;,你可以搜索&#34; rails paginate gem&#34;,看看你可能需要什么样的宝石。这个例子可能会出现&#34; will_paginate&#34;和&#34; kaminari&#34;。然后你必须尝试推断出哪些宝石是必需的。也许在命令行上执行grep will_paginate app -r以查看它是否正在使用will paginate。 grep命令在名为&#34; app&#34;的目录中搜索字符串&#34; will_paginate&#34;,-r使其以递归方式对所有文件执行此操作

答案 1 :(得分:2)

即使rails是一个完整的堆栈Web框架,如果你愿意,它也可以使用某些部分,

Ex:在你的情况下

db - 目录用于保持迁移以创建数据库/表,但如果您使用旧数据库或数据库内容由数据库管理员处理,您可能不需要它。 (您只需通过database.yml文件连接到数据库)

Gem文件正在帮助您将所有宝石(库)保存在一个地方,就像使用Maven一样(在java中)

测试,再次如果您完成了写测试用例(这绝对是一个坏主意),您需要这样做

供应商,适用于第三方插件,doc适用于文档,因此适用相同的规则,如果您需要它们,则可以跳过它们

Hibernate在rails中称为“Activerecord”,概念相同,模型与数据库表绑定(技术上模型表示表中的raw)

所以,如果你真的想要他们添加它们,但如果不是只留下它们

但是,我认为拥有一个合适的Gem文件和测试用例是必须的

欢迎来到Rails

HTH

答案 2 :(得分:2)

在下文中,我假设您已经知道如何:

  • 将数据库架构转储为SQL文件
  • 启动Rails控制台(rails c
  • 生成Rails迁移

以下是我认为你应该做的事情。

  1. 确定哪些类与物理表相对应(您在问题中提到了一些视图,这使我相信模型的一个子集绑定到数据库视图而不是实际表)。为此,您需要将模型的定义(扩展ActiveRecord :: Base的类)与模式转储中的CREATE TABLE语句相匹配。例如,Ruby代码中的class Person与数据库模式转储中的CREATE TABLE people匹配。

  2. 一旦确定了这些模型(类名),就可以启动Rails控制台,同时键入这些模型名称,然后按Enter键。名为Person的模型的控制台输出可能看起来像这样:

  3. >> 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,以及其他一些完全针对特定领域并且无法在通用答案中捕获的小东西。

    HTH。