【问题标题】:validates_uniqueness_of with a datetimevalidates_uniqueness_of 带有日期时间
【发布时间】:2016-11-07 12:02:02
【问题描述】:

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

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

谢谢

【问题讨论】:

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

标签: ruby-on-rails validation datetime ruby-on-rails-4 activerecord


【解决方案1】:

为此创建自定义验证是非常合理的,但您可以使用exists? 而不是count/&gt; 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

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多