我有一个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完成的(出于明显的可伸缩性原因)。
有什么想法?还有更好的方法吗?
答案 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]我猜这个记录查找应该更快,因为它可以使用索引。