当前位置:  开发笔记 > 后端 > 正文

在Ruby on Rails中使用迁移

如何解决《在RubyonRails中使用迁移》经验,为你挑选了1个好方法。

我想确认以下分析是正确的:

我正在RoR中构建一个Web应用程序.我有一个我的postgres db设计的数据结构(大约70个表;这个设计可能需要在开发过程中进行更改和添加以反映Rails的处理方式.EG,我设计了一些用户和角色表 - 但是如果使用Restful是有意义的身份验证,我将擦除它们并替换RA所需的任何内容.)

我有一个shellcript,它调用一系列.sql文件来填充空数据库中的表和初始数据(例如,城镇预先填充了邮政城镇)以及测试数据(例如,公司得到一些虚拟公司所以我有数据可以玩).

例如:

CREATE TABLE towns (
  id         integer PRIMARY KEY DEFAULT nextval ('towns_seq'),
  county_id  integer REFERENCES counties ON DELETE RESTRICT ON UPDATE CASCADE,
  country_id integer REFERENCES countries ON DELETE RESTRICT ON UPDATE CASCADE NOT NULL,
  name       text    NOT NULL UNIQUE
);

命题0:数据持续时间长于应用程序,因此我确信我希望在数据库级别强制执行参照完整性以及在我的RoR模型中进行验证,尽管缺少DRYNESS.

命题1:如果我用迁移替换脚本和sql文件,目前无法告诉我的Postgres数据库有关外键和我当前在迁移代码中的SQL DDL文件中设置的其他约束.

命题2:迁移的好处是对模式的更改与RoR模型代码一起进行了版本控制.但是如果我将我的脚本和.sql文件保存在railsapp/db中,我可以轻松地对它们进行版本控制.

命题3:鉴于迁移缺乏我想要的功能,并提供我可以复制的好处,我没有理由考虑使用它们.所以我应该在脚本/生成模型时间--skipmigrations.

我的问题:如果命题0被接受,命题1,2,3是真还是假,为什么?

谢谢!



1> Ben Scofield..:

命题1在至少两种情况下是错误的 - 您可以使用foreign_key_migrations之类的插件来执行以下操作:

def self.up
  create_table :users do |t|
    t.column :department_id, :integer, :references => :departments
  end
end

这会在您的数据库中创建适当的外键约束.

当然,您可能还有其他想要在DDL中执行的操作,在这种情况下,第二种情况变得更加引人注目:您不必在迁移中使用Ruby DSL.请尝试使用该execute方法:

def self.up
  execute 'YOUR SQL HERE'
end

通过这种方式,您可以将SQL脚本的内容保留在迁移中,从而获得后者的好处(最重要的down是您在原始问题中未解决的方法)并保留您喜欢的较低级别控件.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有