Rails - 在模型中定义数据字段

时间:2013-10-26 20:34:56

标签: ruby-on-rails

使用rails 4,我想在一个地方建模我的整个数据模型。 据我所知,通常通过迁移或使用rails generate scaffold命令以及模型文件中的类之间的关联来生成每个类的字段。这感觉有点麻烦,我想知道是否没有办法在一个地方拥有它。我想知道是否可以在模型文件中进行字段定义。这样可以在一个地方查看和编辑整个模型 - 非常有用且紧凑,可以引导具有多个关联的新应用程序。

2 个答案:

答案 0 :(得分:3)

具体取决于你所谈论的内容。直接回答你的问题

  

我想知道是否可以在模型文件中添加字段定义

不幸的是,在您的ActiveRecord::Base模型和数据库之间没有这样的方法(至少没有我知道的)。简而言之,这种形式的同步是通过rails迁移文件完成的。

使用rails g scaffold命令的便利之处在于它可以一次为您创建迁移文件以及控制器,模型和测试类。但是,您绝对不需要通过脚手架进行任何操作;如果你愿意,你可以一块一块地做。如果在描述字段时出错或需要修改某些内容,则只需编写/生成新的迁移文件。

您可以从技术上在模型中编写任何您想要的内容,但除非您(A)手动更改数据库(坏主意)或(B)编写或生成迁移文件,否则它不会反映在数据库中根据需要改变数据库(更好的主意)。

基本上,要做你正在考虑的事情,你通常会想要编写/生成一个迁移。如您所知,迁移本质上是一个以某种方式更改数据库的脚本:添加或删除列,重命名列,创建表等等。

除了关联之外,模型中没有写入字段信息。从数据库加载记录时,ActiveRecord(基本上)使用适当的访问者/ mutator构建对象。简而言之,无论数据库中为该表/模型定义了哪些列,您的模型对象都将包含这些列。

关于生成脚手架时关于关联很麻烦的说明,如果你指的是Rails如何只在指定的模型中编写关系的belongs_to部分,是的,这可能有点令人讨厌,但我相信原因仅仅是因为关系的一面是唯一可以准确假设的一面; Rails不知道你最终希望拥有什么样的关系。所以你确实需要在相关模型中指出关系的“另一端”(例如has_many侧)。

希望我的漫无边际。

修改

关于评论中的问题,我现在无法想到任何“快捷方式”或工作流程建议。老实说,我认为在这种情况下最好的工作流程是在你写任何东西之前尽量确保模型尽可能“正确”。

以这种方式思考:在可以将模型与数据库同步的框架中,您基本上都在做与迁移相同的事情,因为他们必须执行相同类型的数据库命令(alter table等)。唯一的区别是(A)Rails迁移充当每个变化的记录,(B)明确指出迁移的细节。更不用说,你可以自由地在迁移中做更多的事情,或者添加一些决策逻辑等。

一般来说,尽管看起来非常庞大而且繁琐,但进行大量迁移并不是件坏事。事实上,我甚至会说它的预期(特别是对于寿命更长的系统)。正如我所说,它显示了沿途发生的事情的记录,意味着系统如何演变和变化。此外,当您需要部署应由其他开发人员选择和/或在生产中执行的更改时,它们非常有用。

请注意,如果您是第一次在生产中部署,一个常见的事情是执行'rake db:schema:load'来立即加载整个架构(没有数据,只有表结构)。这比运行每次迁移要快得多。但这仅适用于首次安装

另外注意,上面的段落也是您不希望在迁移文件中放置任何种子信息(意思是,不创建记录)的原因。这就是你的seed.rb文件的用途。

总而言之,我认为你可以忽略的主要观点是迁移非常类似于版本控制系统(GIT,SVN等)的提交历史。我不了解你,但我的提交历史确实有很多“修复bug A”和“修正以前提交的bug修复”等等,虽然它很奇怪,但这在技术上是完全可以接受的,也许在大多数情况下都有所期待例。

答案 1 :(得分:2)

通常,您将在模型中定义关联,并通过迁移管理模型的数据库字段。脚手架不是建立模型之间关联的正确解决方案。脚手架将构建模型,视图和控制器,因此它有时会过度杀伤。更不用说,当你使用脚手架时,你会为你生成的每个脚手架获得完整的CRUD。它通常会增加你需要的东西。