是否有一个gem允许您根据模型的更改创建迁移?

时间:2013-05-15 19:57:53

标签: ruby-on-rails rubygems database-migration

有没有办法使用您在模型中进行的更改来创建迁移?例如,我有Foo模型,baroof属性已经存在于db中。我想将属性rab添加到Foo。有没有办法将此属性添加到类中并生成可识别此更改的迁移?

我会在Foo模型文件中将:rab添加到attr_accessible,这个神奇的函数会自动创建如下的迁移:

class AutoMigrate < ActiveRecord::Migration
  def change
  add_column :foo, :rab, :string
end

感谢。

这是我发现的另一个有更多信息的帖子 Rails - Generating migration script from model

看起来DataMapper可能是我正在寻找的解决方案,但我很想从ActiveRecord迁移。

https://github.com/datamapper/dm-rails

3 个答案:

答案 0 :(得分:3)

不,这有点落后于Rails的预期效果。

一个问题是,您通常会拥有attr_accessible属性,例如,用于生成持久加密密码的密码字段。< / p>

答案 1 :(得分:1)

像戴夫说的那样,你在某种程度上走错了路。

ActiveRecord为数据库中的每个现有列创建方法,例如如果表格中的foobar列与模型对应,则您使用foobar方法和foobar=(value)方法。

如果您刚开始使用新的Rails应用,则可以而且应该通过迁移创建架构,并且use the migration generators built into Rails for that, and then tweak the migration files as needed并运行rake db:migrate

如果您在Rails之外对数据库进行更改,那么您已经可以通过ActiveRecord访问它了。

如果你rake db:schema:dump,你应该能够看到数据库中的列。

如果要确保备份架构(包括不属于现有迁移的SQL),请考虑使用config.active_record.schema_format = :sql中的config/application.rb选项。然后,当您执行db/schema.rb时,您将拥有一个db/structure.sql,而不是拥有rake db:schema:dump,并将架构创建SQL转储到该文件中。

根据您在Dave的回答中的评论,您还想要创建一个属性。您可以通过迁移来改变列,使其不可为空。您还可以向模型添加验证以满足要求。如果您正在学习而不必使用它们,请不要使用attr_protectedattr_accessible。 Rails 4中的批量分配安全性消失了,你会因为认为它们与所需的内容有关而感到困惑(无论如何你都要使用强参数 - 请参阅我对上述问题的评论)。必需字段通常应首先由DB限制(可空或不可能,可能是约束/触发器)处理,然后通过验证 - 在服务器端通过ActiveRecord验证处理,然后在客户端通过HTML / Javascript处理。

答案 2 :(得分:0)

我不知道这样的任何宝石,甚至不知道如何实现。 它违反了惯例。另外一个主要问题是如何通过向attr_accessible添加内容来了解​​属性类型。没有办法知道它是一个字符串还是浮点数等。只要遵循惯例就不要编辑schema.rb file

只需生成新的迁移即可将属性添加到Foo模型

rails generate migration add_rab_to_foo rab:string

然后运行迁移

rake db:migrate