0

我是 Rails 新手,并试图了解迁移和模型之间的关系。据我所知,迁移似乎只影响数据存储,因此在我使用脚手架创建资源之后,我是否负责保持模型和迁移同步?有什么工具可以帮助做到这一点吗?

抱歉,如果这是一个明显的问题,我仍在研究文档。

4

5 回答 5

3

所有迁移都是修改数据库。Rails 负责维护模型和数据库之间的同步。

您可以拥有一个具有 的Useridfirs_name并且您的类模型可能如下所示

class User < ActiveRecord::Base
end

如您所见,模型类是空的,您仍然可以像这样访问该类的方法:

@user = User.new
@user.first_name = "Leo"
@user.save!

它会知道如何处理它。

迁移只是允许您在增量步骤中修改数据库同时在数据库模式上保持健全的版本控制的文件。

当然,如果您尝试从模型中调用数据库或ActiveRecord::Base父类中不存在的东西,Rails 会抱怨。

@user = User.new
@user.awesome
#=> undefined method `awesome` for #<User:some_object_id>

至于迁移,您可以有多个迁移影响一个表。您的工作只是知道您添加到模型中的属性。Rails 将为您完成剩下的工作。

于 2013-05-09T15:27:21.513 回答
0

一般的经验法则是迁移最适合数据定义 - 表中的列、它们的类型、约束等。所以不,您不需要使迁移与数据保持同步。

如果从长远来看,您的数据定义本身会发生变化(新列或列类型的变化),那么只需添加一个新的迁移指定相同的内容。

于 2013-05-09T15:27:29.630 回答
0

ActiveRecord 模型通常由数据库驱动。数据库中定义的任何字段(通常)将自动显示为绑定到该表的 activerecord 模型中的属性。

更改模型不会更改架构(通常)。要更改模型,通常会定义迁移并将其运行到数据库中。

请注意,没有什么可以阻止您使用 attr_accessor 等在模型上定义其他属性,但是如果它们绑定到的架构中没有列,则 ActiveRecord 不会保留这些属性。

于 2013-05-09T15:28:36.447 回答
0

我接受了 Leo 的回答,因为他帮助我更好地理解了事情,如果我刚刚到达迁移页面的底部,我可能不需要问: http: //guides.rubyonrails.org/migrations.html#什么是架构文件

提到的 annotate_models gem 听起来也有助于提高对类模型当前结构的认识,而无需参考模式。

于 2013-05-09T20:32:55.533 回答
0

如果你想恢复 attr_accessor 行为,而是给一个白名单,给一个黑名单,你可以使用这个来为每个模型做:

attr_accesible *atribute_names - %(attributes black list)
于 2013-05-09T21:10:34.863 回答