我正在将一个应用程序从 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)