我正在将应用程序从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:错误:关系” table_name “不存在”错误描述here。不确定为什么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 => :更新
错误处理程序本身是:
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
如果有人可以整理我的代码,请(有关模型是人)