2

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

我的问题是:

  • 每次更新/创建单行时,都要进行查询以检查当年的唯一性是否繁重?我应该如何处理这个问题?
  • 我只在 CakePHP 上使用了自定义验证器,你能发布一个愚蠢的例子来给我看一个语法例子吗?

编辑1:

请注意,当前年份存储在名为expire_date年-月-日日期格式的列中。但是,该检查应仅针对该年度进行。我该如何处理?这就是为什么我想我应该使用自定义验证器,我认为scope在这种情况下不应该工作。

编辑2:

我刚刚注意到一个:if选项,我会检查我是否可以通过它来实现它。

4

2 回答 2

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

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

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

于 2012-06-26T02:38:28.063 回答
2

ActiveRecord 已经有了!

validates_uniqueness_of :car_number, :scope => :year

validates_uniqueness_of的文档

于 2012-06-26T02:34:26.300 回答