我是rails的新手,并试图了解迁移和模型之间的关系。据我所知,迁移似乎只影响数据存储,因此在我使用scaffolding创建资源后,我是否负责保持模型和迁移同步?有没有工具可以帮助解决这个问题?
很抱歉,如果这是一个显而易见的问题,我仍在努力完成文档。
答案 0 :(得分:3)
所有迁移都是修改数据库。 Rails处理维护模型和数据库之间的同步。
您可以拥有一个User
表,其中包含id
,firs_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)