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
0
whitesiroi 24 Апр 2014 в 08:16

3 ответа

Лучший ответ

Поскольку они могут иметь разную точность в миллисекундах.

См. Сообщение: Проверка объектов ActiveSupport :: TimeWithZone на равенство

Скорее всего, значения миллисекунд будут неравными.

puts i1.created_at.usec
puts i2.created_at.usec
2
Community 23 Май 2017 в 10:28

Я думаю, что если вы получаете concurrent requests, есть вероятность, что у вас может быть несколько записей в таблице, которые создаются одновременно и будут иметь одинаковые отметки времени.

Как вы сказали, если вы не хотите сохранять с одним и тем же date, вы можете поставить lock при сохранении записей, исключив возможность создания двух записей одновременно. В этом случае validates_uniqueness_of :created_at также должен работать.

1
Saurabh 24 Апр 2014 в 04:34

Так, на всякий случай

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
1
whitesiroi 24 Апр 2014 в 07:41