我有一个用户模型,它检查值是否在 before_save 发生变化(通过运行 User.zipcode_changed?)。这个想法是,如果有延迟的工作,这将排队。
问题是,当我从头开始迁移应用程序时出现错误:
An error has occurred, all later migrations canceled:
undefined method `postcode_changed?' for #<User:0x105db6158>
因此,我应该把它们放在哪里?模型是不是放错地方了?
最佳答案
当您从头开始 checkout 一个新项目时,您不应使用迁移来构建数据库。
您应该改用 rake db:schema:load
。
让我告诉你为什么。
假设您在迁移 10 上创建了一个带有 post 表的新 Post
模型。
在迁移 11 中,您对 Post
模型执行了一些特殊的阐述。
一段时间后,您决定删除 Post
模型和 post 表,因为不再需要了。
六个月后,您从头开始检查项目。如果您尝试运行 rake db:migrate
,迁移 11 将失败并提示缺少模型。的确,该模型已在多个月前被删除,并且不再可用。
相反,如果您运行 rake db:schema:load
,您将使用正确的模式版本初始化数据库。
谈到迁移,如果您刚刚创建了 postcode 方法并且您正在尝试使用 _changed?同一次迁移中的 magic 方法,需要先重新加载 schema。
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
关于ruby-on-rails - _changed 放在哪里合适? Rails 中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1941634/