有没有办法使用您在模型中进行的更改来创建迁移?例如,我有Foo
模型,bar
和oof
属性已经存在于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迁移。
答案 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_protected
和attr_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