我想确认以下分析是正确的:
我正在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在至少两种情况下是错误的 - 您可以使用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
是您在原始问题中未解决的方法)并保留您喜欢的较低级别控件.