ruby-on-rails - _changed 放在哪里合适? Rails 中的方法?

标签 ruby-on-rails ruby activerecord

我有一个用户模型,它检查值是否在 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/

相关文章:

ruby-on-rails - activerecord如何查询关联的多个条件?

ruby-on-rails - 为模型关联创建 form_for

ruby-on-rails - 如果 Ruby on Rails 中存在外键,如何删除它?

ruby-on-rails - 使用 Rails 编写 RSpec 测试时,spec/requests 文件夹和 spec/controllers 应该放什么?

ruby - 从 Ruby 中的 RSS 提要中获取日期

mysql - Codeigniter:我可以在我的 Controller 函数中使用 $this->db->trans_start() 和 trans_complete 吗?

ruby-on-rails - 使用 Rails 3 在 heroku 上使用 Gmail

mysql - Rails 如何按查询进行不同和分组

ruby-on-rails - 如果没有关联,RoR 允许删除

sql - 计算两个日期时间之间的时间 - ActiveRecord/SQL/Heroku