【问题标题】:Validation doesn't work (Rails 3)验证不起作用(Rails 3)
【发布时间】:2014-05-19 03:12:56
【问题描述】:

model/item.rb我有自定义验证方法

  validate :double_dates
  after_save :double_check

  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

验证方法在“rails c”中确实有效。但是,当我同时运行两个任务时(rails runner "ApplicationController.rotate" 我在旋转方法中有 Item.save) - 验证停止工作。

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
irb(main):048:0> i1.created_at.class
=> ActiveSupport::TimeWithZone
irb(main):049:0> i2.created_at.class
=> ActiveSupport::TimeWithZone
irb(main):050:0> i1.created_at.usec => 311714 
irb(main):051:0> i2.created_at.usec => 312779 

任何提示或建议将不胜感激。

【问题讨论】:

  • 所以你的主要交易是你不想拥有两个具有相同创建时间的项目,但你实际上拥有它们,对吧?
  • 是的,我不希望两个项目的日期相同。但是,现在几乎是同一时间 :) 只有 usec 不同。

标签: ruby-on-rails ruby ruby-on-rails-3 validation model


【解决方案1】:

我曾经遇到过类似的问题,并且猜测您实际上可以通过向表添加索引来解决这个问题。向 Items 中的 created_at 列添加索引。

Here 你已经对 Rails 中的索引有了完整的解释。

希望对你有帮助!

【讨论】:

  • 非常感谢你的朋友。我刚刚在本地机器上对其进行了测试,看起来它成功了。请让我在大约 24 小时后在服务器上确认它,在 cron 完成他的工作之后,我将能够检查它。因为,我在想它不会起作用,因为 usec 是不同的 :) 再次感谢你,我明天会检查它,我希望它不起作用,我会接受你的回答。
  • 没问题老兄!如果您在服务器端遇到任何其他问题,请询问!但我们希望你没有:)
  • 嗨,伙计:) 有相同的东西 :) 只有 usec 不同 :))) 不过,非常感谢 :) 现在我知道为什么我有这些东西了 :)
  • 谢谢你的队友 :) 你的东西 + @i.created_at = Time.now.change(usec: 0) 解决它 :) 再次,非常感谢你 :) 有一个美好的生活 :)
【解决方案2】:

感谢@FabKremer,我能够解决它:)

通过在Item.save 之前添加@i.created_at = Time.now.change(usec: 0) :)

不过我接受他的回答,因为它适用于大多数情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多