可以创建一个应该运行查询来验证的自定义验证器吗?

时间:2012-06-26 02:27:16

标签: ruby-on-rails ruby-on-rails-3

我需要验证表的会员卡号仅对当前年份是唯一的,因此我必须为我的模型列构建自定义验证器。

我的问题是:

  • 每次更新/创建一行时,查询当前年份的唯一性是否很重要?我怎么期望交易 这个?
  • 我只在CakePHP上使用自定义验证器,你能发布一个愚蠢的例子只是为了向我展示语法示例吗?

修改1:

请注意,当前年份存储在名为expire_date的列中,该列是年 - 月 - 日日期格式。 但是,该检查仅适用于一年。 我怎么处理这个?这就是为什么我认为我应该使用自定义验证器,我认为scope在这种情况下不应该起作用。

编辑2:

我刚注意到:if选项,我会检查是否可以通过它实现此功能。

2 个答案:

答案 0 :(得分:3)

Rails 3提供了语法糖,所以你可以这样做:

validates :car_number, :uniqueness => {:scope => :expire_year, :message => 'has already been taken this year'}, :on => :update

def expire_year
  expire_date.strftime("%Y")
end

查询的重要程度取决于数据库架构和负载。不要忘记在年份列上设置索引并检查rails日志。

请注意,这仅适用于更新,因为新对象在保存之前不会填充时间戳。

答案 1 :(得分:2)

ActiveRecord已经有了!

validates_uniqueness_of :car_number, :scope => :year

validates_uniqueness_of的文档