Nei*_*ton 1 ruby activerecord ruby-on-rails
我有一个用户模型,检查一个值是否已更改before_save(通过运行User.zipcode_changed?).这个想法是,如果有的话,这将排除延迟的工作.
问题是,当我从头开始迁移应用程序时,我收到一个错误:
An error has occurred, all later migrations canceled:
undefined method `postcode_changed?' for #<User:0x105db6158>
Run Code Online (Sandbox Code Playgroud)
因此,我应该把它们放在哪里?模特是错的地方吗?
从头开始签出新项目时,不应使用迁移来构建数据库.你应该使用rake db:schema:load.
让我告诉你原因.
假设您Post在迁移10上创建了一个带有post表的新模型.在迁移11中,您将对Post模型执行一些特殊的详细说明.一段时间后,您决定放弃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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |