Rails RAILS 能不能从数据库逆向生成 CRUD 的代码?

dreamrise · 2012年03月19日 · 最后由 hhuai 回复于 2012年04月05日 · 4552 次阅读

传统的开发模式是,先做数据库设计再做编码

现在的情景是:我数据库已基本建成了(企业级的,几百张表), 然后想运行某个 rails 工具?

希望这个工具能逆向生成这些表的所有 CRUD 代码。包括 control,model,view 的。主要是 view 的 index.html.erb 和_form.html.erb。这里面都需要根据字段名,以及数据类型生成不同的 HTML 代码以及 label。

例如:

index.html.erb
<% @products.each do |product| %>
  <tr>
    <td><%= product.title %></td>
    <td><%= product.description %></td>
    <td><%= product.image_url %></td>
    <td><%= product.price %></td>
    <td><%= link_to 'Show', product %></td>
    <td><%= link_to 'Edit', edit_product_path(product) %></td>
    <td><%= link_to 'Destroy', product, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>

_form.html.erb
 <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%= f.label :image_url %><br />
    <%= f.text_field :image_url %>
  </div>
  <div class="field">
    <%= f.label :price %><br />
    <%= f.text_field :price %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>


我是发现 PHP 的 YII 有这个功能,RAILS 应该也有吧?

scaffold 可以呀

这个,如果有,以后不用要程序员了,找个 DBA+美工就好了。:)

#1 楼 @huacnlee 需要指定 表名 和 表结构 吧? 楼主的意思是,不用指定任何表名和表结构,系统去主动分析吧?

无逻辑的话,phpMyAdmin 算了

如果说只要一句话,就生成所有表的 CRUD 代码,好像也挺不错的。 没听说 rails 有这样的功能,可以去 github 上找找有没有类似的 gem。

scaffold 需要输入表结构代码,再根据你输入的代码来生成啊,这个跟从数据库中抓取结构来生成,不是一回事。

其实传统的开发模式是,先做数据库设计再做编码。PHP,JAVA,.NET 都有这种工具。

而 Rails 是一边编码,一边创建数据库。

#7 楼 @dreamrise Rails 管这种模式叫做敏捷开发,呵呵呵,这种模式比较适合新项目。不过的确和传统模式不同。我开始的时候也觉得有点怪怪的。

其他语言我不清楚 .net 下这样的工具很多,我这边一个同事做了一个为我们内部框架生成代码的工具 根据数据库表结构 生成 CRUD 的 SQL 并配入指定格式的配置文件,DataAccess,DataContract,ServiceContract,Service,和注释都生成了,拿过来,改改,变化复杂部分琢磨琢磨再改改,就可以用了,就少能生成 Web 这层的东西了。

你应该说的是生成所谓的 DAO 层跟 bean 吧,controller 这种跟逻辑有关系的能从数据库中找到关系?

楼主说的这个东西,不应该存在 Rails 框架中,实际生产中适用的情况太少了,即使是 scaffold 生成的表单,都要修改过才行。你可以尝试一下 https://github.com/sferik/rails_admin ,也许是你要的东西。

在很久很久以前有个东西叫动态脚手架,就类似你说的东西... 确实很炫...但是意义不大...楼主可以搜索一下

一直就是支持先有表的。你建个 model 与表对应,然后指定对应的表和标识字段就 OK 了。记住一定要有标识字段。然后你的一对多,多对多关系,都可以靠这种方式建立。以前的一个项目,后台连接的是 以前项目的 sqlserver2005,我们就是这样做的。scaffold 那种东西只是看上去很美而已。

或者这样,你可以用 scaffold 来生成,表字段随便填写。完成后,不用 db:migrate,最后在 model 里面指定表和标识字段的映射关系。这样你 model,views,routes 就都有了。这样应该满足需求了吧。

建立楼主去看下 activeadmin,这个可以做

#12 楼 @poshboytl 楼主说的,不是动态脚手架 而是从数据库结构分析,创建出 mvc 的基础代码

写个脚本把所有的表列出来,然后根据列和列类型生成 scaffold,然后逐个跑一遍就 ok 了

#14 楼 @outman #17 楼 @yangkit 这个思路不错,我准备就这么搞了。必须要跑一遍吧,要不然会少几个 rails 附加的时间字段。

之前的数据库表还是 powerdesigner 做的,我还得写一段 vbscript 来导出定义。

其实我现在也需要一个这样的东西,但没有时间搞,楼主要是搞好了,说一下经验或是共享一下代码啊

#19 楼 @dreamrise cakephp 是先定义表结构,再逆向生成代码,包括验证和模型关系。我想你要的就是这种东西,但我不知道 Rails 里面是否有这样的 gem。

#7 楼 @dreamrise 能说一下 java 和.net 下分别是什么样的工具提供了这样的功能?

rails 适合新项目,老项目反而发挥不了它快捷的优势。rails 对表命名都有规范的,严重不符合规范的处理起来会比较麻烦。

powerdesigner 中导出命令行语句的 vba 代码已做好,本来还想加入主键等定义的,貌似命令行不支持了?那样的话,除了生成命令行命令,还要生产一套 db/schema.rb 的代码才完整? $ rails generate model Usage: rails generate model NAME [field:type field:type] [options]

可以用 active_record 或 Sequel 分析出来,再生成 scaffold。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号