放置_changed的正确位置在哪里?Rails中的方法?

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)

因此,我应该把它们放在哪里?模特是错的地方吗?

Sim*_*tti 6

从头开始签出新项目时,不应使用迁移来构建数据库.你应该使用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)