Rails:验证按日期范围确定的唯一性

时间:2009-09-30 16:53:20

标签: ruby-on-rails ruby scope validates-uniqueness-of

我有一个Rails模型,应该只允许每个用户每天保存/更新一次模型。我有一个回调来执行查找用户和日期然后添加到错误,但这是丑陋的,感觉像铁轨一样。我有典型的created_at / updated_at列(时间部分很重要/我需要保留它)。

所以我认为我可以:

1)创建另一个模型属性,该属性只是创建日期和范围(bleh)

2)使用:scope属性,但不知何故只获得created_at的日期部分,例如validates_uniqueness_of:user,:scope => :created_at.to_date(显然不起作用)

3)验证除非=> Proc.new {| o |与我现有的回调相匹配的Finder}(总计)

http://ar.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M000086

不会有大量的这些,但我宁愿它是用SQL而不是Ruby完成的(出于明显的可伸缩性原因)。

有什么想法?还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

我最终使用validates_uniqueness_of选项和class AttendanceRecord < ActiveRecord::Base validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } } end 并将lambda传递给限制所检查的记录。

{{1}}

答案 1 :(得分:1)

您也可以编写自己的验证方法。这非常easy。在自定义验证方法中,date_trunc(Postgresql)可用于在所需的时间跨度内查找现有记录。 date_trunc也可以参数化(例如,小时,星期,星期,月)。

可以使用简单条件代替date_trunc来查找冲突记录。例如 [“user_id =?AND updated_at&gt; =?”,self.user_id,Time.now.beginning_of_day]我猜这个记录查找应该更快,因为它可以使用索引。