为什么迁移不更新模型?

时间:2013-05-09 15:20:09

标签: ruby-on-rails-3

我是rails的新手,并试图了解迁移和模型之间的关系。据我所知,迁移似乎只影响数据存储,因此在我使用scaffolding创建资源后,我是否负责保持模型和迁移同步?有没有工具可以帮助解决这个问题?

很抱歉,如果这是一个显而易见的问题,我仍在努力完成文档。

5 个答案:

答案 0 :(得分:3)

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

您可以拥有一个User表,其中包含idfirs_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将为您完成剩下的工作。

答案 1 :(得分:0)

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

如果在较长时间内,您的数据定义本身发生了更改(新列或列类型中的更改),那么只需添加一个指定相同的新迁移。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

我已经接受了Leo的回答,因为他帮助我更好地理解了事情,如果我刚刚进入迁移页面的底部,我可能不需要问:http://guides.rubyonrails.org/migrations.html#what-are-schema-files-for

提到的annotate_models gem在帮助提高对类模型当前结构的认识方面非常有用,而无需参考模式。

答案 4 :(得分:0)

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

attr_accesible *atribute_names - %(attributes black list)