1

我正在将一个应用程序从 rails 2.3 迁移到 rails 3。我计划迁移到 heroku,所以我也迁移到 postgres。

我有一个模型,它有很多字段 - 大约 30 个。我想验证所有这些字段的完成情况,除了 2。在我的 rails 2 应用程序中,我有:

validates_presence_of (self.column_names - ["id", "email_not_name"]), :on => :update

这很有效,而且实际上在 Rails3 中也有效。当我尝试为新数据库运行迁移时出现问题 - 我收到此处描述的“PGError:错误:关系“<em>table_name”不存在”错误。不知道为什么 SQLite3 不会发生这种情况,但这并不重要。

如果我删除验证,迁移运行良好 - 问题是 self.column_names 实际上还不存在。同样,如果我将迁移更改为

validates_presence_of :field1, :field2, :on => :update

迁移将毫无问题地运行。显然,我可以只列出所有 30 个字段,但这让我觉得很笨拙,而且不太易于维护。我真正想要的是:

validates :all, :except=>:email_not_name, :presence=>true, :on => :update

但不幸的是,这实际上并不存在!有没有办法我可以做到这一点而不诉诸于此?(rails2 或 rails3 风格)

回答:

好的,所以对于遇到此问题的任何人,这里是如何做到这一点的。解决方案是创建一个自定义错误处理程序,调用:

验证 :check_all_questions_completed, :on => :update

错误处理程序本身是:

def check_all_questions_completed
 Person.column_names.each do |col|
  if (Person.column_names - ["id", "email_not_name"]).include?(col) && send(col).nil?
   errors.add(col)
  end
 aend
end

如果有人可以整理我的代码,请做(有关模型是Person)

4

0 回答 0