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

时间:2009-12-21 18:00:40

标签: 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>

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

3 个答案:

答案 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的代码。