我有一个用户模型,用于检查某个值是否已更改为before_save(通过运行User.zipcode_changed?)。这个想法是,如果有的话,这将排除延迟的工作。
问题是,当我从头开始迁移应用程序时,出现错误:
An error has occurred, all later migrations canceled:
undefined method `postcode_changed?' for #<User:0x105db6158>
因此,我应该把它们放在哪里?该模型是错误的地方吗?
答案 0 :(得分:6)
从头开始签出新项目时,不应使用迁移来构建数据库。
您应该使用rake db:schema:load
代替。
让我告诉你原因。
假设您创建了一个新的Post
模型,其中包含有关迁移10的帖子表。
在迁移11上,您将对Post
模型执行一些特殊的详细说明。
一段时间后,您决定放弃Post
模型和帖子表,因为不再需要。
六个月后,您从头开始检查项目。如果您尝试运行rake db:migrate
,迁移11将无法抱怨缺少模型。确实,这个模型已经在几个月前被删除了,而且已经不再可用了。
相反,如果您运行rake db:schema:load
,您将使用正确的架构版本初始化数据库。
谈到迁移,如果你刚刚创建了邮政编码方法并且你正在尝试使用_changed?在同一个迁移中的魔术方法,你需要在之前重新加载模式。
class MigrationFile < ...
self.up
add_column :user, :postcode, :string
User.all.each { |user| puts user.postcode_changed? } # will fail
User.reset_column_information
User.all.each { |user| puts user.postcode_changed? } # now it works
end
...
end
答案 1 :(得分:1)
你说两个zipcode_changed?和postcode_changed?在你的问题。数据库中的实际列名是什么 - 邮政编码或邮政编码? ActiveRecord只会创建_changed吗?实际列名的便捷方法。
答案 2 :(得分:0)
您正在做的是合理的模型代码,但在迁移中效果不佳。
在迁移中使用模型代码是有问题的,因为这样的问题。我建议坚持使用面向SQL的代码。