【问题标题】:How to validate :created_at in model (RAILS 3)如何在模型中验证 :created_at (RAILS 3)
【发布时间】:2014-06-09 04:41:23
【问题描述】:
irb(main):044:0> i1.created_at
=> Thu, 24 Apr 2014 02:41:15 UTC +00:00
irb(main):045:0> i2.created_at
=> Thu, 24 Apr 2014 02:41:15 UTC +00:00
irb(main):046:0> i1.created_at == i2.created_at
=> false
irb(main):047:0> i1.created_at.to_time.to_i == i2.created_at.to_time.to_i
=> true

似乎不起作用validates_uniqueness_of :created_at
因为

irb(main):046:0> i1.created_at == i2.created_at
=> false

如何验证 created_at?不想用相同的日期保存。

+++更新+++

irb(main):048:0> i1.created_at.class
=> ActiveSupport::TimeWithZone
irb(main):049:0> i2.created_at.class
=> ActiveSupport::TimeWithZone

【问题讨论】:

  • 有点 OT,但我很想知道为什么您需要 created_at 在两个不同的实例上是唯一的?
  • 有些项目在我的数据库中有两个相同的数据,只有 created_at 不同(除 USEC 外的所有 smae)。我只需要一个,所以我想让它独一无二。

标签: ruby-on-rails ruby ruby-on-rails-3 rails-activerecord


【解决方案1】:

我认为,如果您收到concurrent requests,您可能在表中有多个条目同时创建并且具有相同的时间戳。

如您所说,如果您不想使用相同的date 保存,可以在保存条目时放置lock,从而消除同时创建两个条目的可能性。在这种情况下,validates_uniqueness_of :created_at 也应该可以工作。

【讨论】:

  • 谢谢。我会试试看。必须等到第二天,因为 cron :) 再次感谢你,如果它会起作用,我明天会接受它。
  • 我尝试了 validates_uniqueness_of :) 不起作用 :) 因为 usec 不同。
【解决方案2】:

因为它们可能具有不同的毫秒精度。

参考帖子:Testing ActiveSupport::TimeWithZone objects for equality

毫秒值可能不相等。

puts i1.created_at.usec
puts i2.created_at.usec

【讨论】:

  • irb(main):050:0> i1.created_at.usec => 311714 irb(main):051:0> i2.created_at.usec => 312779 是的,你是对的。谢谢
  • 您可以编写自定义验证器来处理这个问题。参考:guides.rubyonrails.org/active_record_validations.html。第 6.2 节自定义方法。
  • 任何提示如何使它与自定义验证器一起使用?感谢您的链接,我检查了它,但仍然不知道如何使其 created_at 独一无二。很抱歉打扰您,谢谢。
【解决方案3】:

以防万一

class Item < ActiveRecord::Base
  attr_accessible :asin, :domain, :formatted_price, :user_id, :created_at

  validate :double_dates

  private

  def double_dates
    if Item.where(:user_id => self.user_id, :asin => self.asin, :domain => self.domain).where("DATE(created_at) = ?", Date.today).length >= 1
      errors.add(:created_at, "no double dates")
    end
  end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    相关资源
    最近更新 更多