【发布时间】:2012-12-18 14:55:38
【问题描述】:
我是 Rails 的新手,它是一个很棒的平台。
我创建了一个应用程序,但删除了所有迁移脚本。
我想用现有模型中的表创建数据库。
我在网上找不到它,我确信这可能是像任何其他平台(java hibernate 等)一样的选项
命令 rails 生成...只创建没有列的表,但我在现有模型中有列。那我该怎么做呢?
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby rake
我是 Rails 的新手,它是一个很棒的平台。
我创建了一个应用程序,但删除了所有迁移脚本。
我想用现有模型中的表创建数据库。
我在网上找不到它,我确信这可能是像任何其他平台(java hibernate 等)一样的选项
命令 rails 生成...只创建没有列的表,但我在现有模型中有列。那我该怎么做呢?
谢谢!
【问题讨论】:
标签: ruby-on-rails ruby rake
如果您不小心清理了模型并且没有任何迁移,您仍然可以通过运行 rake db:migrate 并使用它来生成 db/schema.rb 文件。无论您对它做了什么,它都应该反映数据库的当前状态。
如果您在其中创建包含重要部分的迁移,您会注意到格式非常相似,您将能够在其他系统上复制该配置。
不过,这样做有点笨拙。每个模型都应该有其相关的迁移。一般来说,这些不会被删除,只有在绝对必要时才会修改,保留模式如何演变为最终状态的历史。
【讨论】:
如果我正确理解了您的问题,那么确实没有办法从 ActiveRecord 模型类构建数据库表 - 最好将 ActiveRecord 模型更多地视为不同风格的关系数据库和 Ruby 对象之间的映射。换句话说,ActiveRecord 模型抽象出数据库的细节,以便独立于数据库。它们使您的数据库数据更容易在 Ruby 中访问。在这样做时,他们没有能力构建您的表格。将它们视为非常漂亮的 getter 和 setter,而不是与数据库的绑定。
这正是迁移存在的原因 - 它们包含特定于数据库的内容。它们本质上包含模型定义的“另一半”——大多数应用程序级别的东西(比如关系,在 MySQL 中不存在,对吧?它们是 ActiveRecord 约定)是在您的模型上定义的,但是,例如,如果你想在你的 Foo 模型上有一个字符串,你可以在 migration 中定义它,你的模型上会提供适当的 getter 和 setter 来让你使用这个字符串。
tl;dr:您需要迁移。它们存在于 Rails 中的事实是有意的设计决定,将 Ruby 模型的一半与数据库的一半分开。
【讨论】: