如何验证:模型中的created_at(RAILS 3)

时间:2014-04-24 04:16:52

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

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?不想以相同的日期保存。

+++ UPDATE +++

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

3 个答案:

答案 0 :(得分:2)

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

请参阅帖子:Testing ActiveSupport::TimeWithZone objects for equality

机会是毫秒值不等。

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

答案 1 :(得分:1)

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

正如您所说,如果您不想使用相同的date保存,则可以在保存条目的同时放置lock,从而无法同时创建两个条目。在这种情况下,validates_uniqueness_of :created_at也应该有用。

答案 2 :(得分:1)

以防万一

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