【问题标题】:Is there a gem that allows you to create migrations based on changes to a model?是否有允许您根据模型更改创建迁移的 gem?
【发布时间】:2013-05-10 13:09:29
【问题描述】:

有没有一种方法可以使用您在模型中所做的更改来创建迁移?例如,我有 Foo 模型,其 baroof 属性已经保存在数据库中。我想将属性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

【问题讨论】:

  • 我猜不是,此外,一个新的 db 字段可能是 attr_protected,但仅仅是一个实例变量可能是 attr_accessible。这不是标准
  • attr_protectedattr_accessible 用于批量分配安全性。它们在 Rails 4 中消失了,所以我现在不会开始使用它们——而是使用强参数或许可程序(使用强参数),因为它们都在 Rails 3.1+ 中工作。 Rails 4 中包含强参数,因此如果使用 Rails 4,则不应将 strong_parameters 添加到 Gemfile。
  • 并不是说不使用 DataMapper,但请阅读我的答案并通读 Rails 指南:guides.rubyonrails.org 您可以为您对数据库所做的现有事情创建迁移,但是您' d 如果使用 ActiveRecord(Rails 的标准 ORM),则需要在数据库的 schema_migrations 表中创建记录,表明它们已经运行。有一种更简单的方法可以做你想做的事,那就是config.active_record.schema_format = :sql

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


【解决方案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/application.rb 中的config.active_record.schema_format = :sql 选项。然后,您将拥有 db/structure.sql,而不是 db/schema.rb,当您执行 rake db:schema:dump 时,架构创建 SQL 会转储到该文件中。

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

【讨论】:

    【解决方案2】:

    我不知道有任何类似的 gem,甚至不知道它是如何实现的。 它与约定相反。此外,主要问题是如何通过向attr_accessible 添加内容来了解​​属性类型。无法知道它是字符串还是浮点数等。只需遵循约定,不要编辑schema.rb file

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

    rails generate migration add_rab_to_foo rab:string
    

    然后运行迁移

    rake db:migrate
    

    【讨论】:

      【解决方案3】:

      不,这与 Rails 预期的工作方式有点倒退。

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

      【讨论】:

      • 这是一个足够的答案@Dave Newton,谢谢。有没有办法通过使模型中的属性成为必要属性来做到这一点?
      • @JoeEssey Meh;您可以创建自己的 attr_xxx-style doodad 来执行默认的 attr_accessible 内容并将其“标记”为“必需”,但无论它是否已添加到先前的迁移中,您还需要坚持, 也。 IMO 如果您要添加持久化的属性,请使用 Rails 方式,即通过迁移。
      猜你喜欢
      • 2011-06-17
      • 2015-10-12
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2016-10-28
      • 2015-10-01
      • 2010-10-16
      相关资源
      最近更新 更多