1

我有一个 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 完成的(出于明显的可伸缩性原因)。

有什么想法吗?有没有更好的办法?

4

2 回答 2

6

我最终使用了该conditions选项validates_uniqueness_of并将其传递给 lambda,它将检查的记录限制为今天的记录。

class AttendanceRecord < ActiveRecord::Base
  validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end
于 2014-10-07T17:30:09.630 回答
1

您也可以编写自己的验证方法。这很容易。并且在自定义验证方法中,可以使用date_trunc (Postgresql) 来查找所需时间跨度内的现有记录。date_trunc 也可以参数化(例如小时、日、周、月)。

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

于 2009-09-30T20:10:24.503 回答