2

我似乎不时遇到此问题,当我想验证一个字段,并将其范围限制为特定日期时,我正在存储日期时间。validates_uniqueness_of与日期时间

validates_uniqueness_of :user_id, scope: [:starts_at, :state] 

问题是starts_at存储为datetime,但我不希望验证的确切时间,而是一般的日期。

当我遇到这个问题时,我通常会创建一个自定义验证方法,并且有时在有时间窗口时有意义,但是我想知道如果我只关心整个日期,我是否忽略了更好的解决方案。

我想避免创建像下面的自定义验证,如果有另一种可能性。

老办法

def check_user_uniqueness 
    if EventLog.where("start_at::date = ? AND id <> ? AND user_id = ?", 
    start_at.to_date, id, user_id).count > 0 
    errors.add(:user_id, "isn't available on this date") 
    end 
end 

感谢

+0

我只能想到一个**自定义验证**。如果'starts_at'是一个**日期(不是日期时间)**,那么它可以通过'validates_uniqueness_of'实现。 – Pavan

回答

1

这是很合理的,为此创建自定义的验证,但你可以很喜欢使用exists?,而不是count/> 0检查,这是更具可读性和不正是你需要的:

def check_user_uniqueness 
    if EventLog.where(id: id, user_id: user_id).exists?("start_at::date = ?", start_at.to_date) 
    errors.add(:user_id, "isn't available on this date") 
    end 
end