导轨:验证独特的作用域按日期
-
19-09-2019 - |
题
我有一个Rails模型应该只允许每个用户每天节省/一个模型的更新一次。我有一个回调的用户和日期做查找然后添加到错误,但是这是丑陋的,感觉非轨道状。我有典型created_at / updated_at字段(和时间部分是显著/ I必须保持它)。
所以我想我既可以:
1)创建其仅仅是由(的Bleh创建和范围的日期)的另一模型属性
2)使用:范围属性,但不知得到的只是created_at的日期部分,如validates_uniqueness_of:用户,:范围=>:created_at.to_date(不工作,很明显)
3)验证,除非=> Proc.new {| O |取景器,我的现有回调匹配}(毛)
http://ar.rubyonrails.org/classes/ActiveRecord /Validations/ClassMethods.html#M000086
有不会的这些压倒性的数字,但我宁愿它是在SQL,而不是红宝石做(出于明显的可扩展性的原因)。
任何想法?有没有更好的办法?
解决方案
您也可以编写自己只会验证方法。这是相当容易。而在自定义的验证方法, date_trunc (PostgreSQL系统)可用于查找所需的时间跨度现有记录。 date_trunc也可以参数化(e.g.hour,日,周,月)。
的相反date_trunc一个简单的条件可以被用于发现冲突的记录。例如 [ “USER_ID =?AND的updated_at> =?”,self.user_id,Time.now.beginning_of_day]我想这个记录查找应该会更快,因为它可以使用索引。
其他提示
我结束了使用 conditions
选项有validates_uniqueness_of
和传递拉姆达限制检查记录只是那些今天。
class AttendanceRecord < ActiveRecord::Base
validates_uniqueness_of :user_id, conditions: { -> { where("DATE(created_at) = ?", Date.today) } }
end