2

有没有办法使用您在模型中所做的更改来创建迁移?例如,我的Foo模型baroof属性已经保存在数据库中。我想将属性添加rab到 Foo. 有没有办法将此属性添加到类并生成识别此更改的迁移?

我会添加:rabattr_accessibleFoo 模型文件中,这个神奇的函数会自动创建如下迁移:

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

谢谢。

这是我发现的另一个线程,其中包含更多信息 Rails - 从模型生成迁移脚本

看起来 DataMapper 可能是我正在寻找的解决方案,但我对从 ActiveRecord 迁移感到犹豫。

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

4

3 回答 3

3

不,这有点倒退到 Rails 期望的工作方式。

一个问题是您通常会拥有attr_accessible应该被持久化的属性,例如,用于生成持久化加密密码的密码字段。

于 2013-05-15T20:10:37.863 回答
1

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

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

如果您刚开始使用新的 Rails 应用程序,您可以并且应该通过迁移创建模式,您可以使用 Rails 中内置的迁移生成器,然后根据需要调整迁移文件并运行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转储到该文件中的架构创建 SQL ,而不是拥有rake db:schema:dump

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

于 2013-05-15T20:19:59.933 回答
0

我不知道任何这样的宝石,甚至不知道如何实现。它与约定相反。此外,主要问题是如何通过向attr_accessible. 没有办法知道它是字符串还是浮点数等。只需遵循约定,不要编辑schema.rb file.

只需生成一个新的迁移以将属性添加到 Foo 模型

rails generate migration add_rab_to_foo rab:string

然后运行迁移

rake db:migrate
于 2013-05-15T20:04:17.777 回答