【问题标题】:How do I validate one post per day?如何每天验证一篇帖子?
【发布时间】:2013-07-20 12:27:37
【问题描述】:

我正在尝试创建一个验证,以确保从 00:00 开始每天 24 小时发布一个帖子。请问如何在 Rails 中做到这一点?

我执行了以下操作,但我不确定在哪里放置 today 方法。非常感谢更简单的替代方案。

def today
  where(:created_at => (Time.now.beginning_of_day..Time.now))
end

然后我向文章模型添加了验证:

validate :time_limit, :on => :create

并在同一模型中定义time_limit,如下所示:

def time_limit
 if user.articles.today.count >= 1
 errors.add(:base, "Exceeds daily limit")
end

但我在创建操作中不断收到“无方法”错误。

undefined method `today'

我不确定该把这个方法放在哪里。

【问题讨论】:

    标签: ruby-on-rails ruby cron


    【解决方案1】:

    您应该为此使用范围:

    class Article
      scope :today, -> { where(:created_at => (Time.now.beginning_of_day..Time.now.end_of_day)) }
    end
    

    http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/scope

    【讨论】:

    • 我建议不仅从午夜到现在检查是否为全天创建了帖子。这种方式范围可能是可重用的(比如 - 当天的帖子)
    • 对不起,你能再解释一下吗?我不太明白你的意思。
    • @Joshua 如果你问迈克尔,我已经采纳了他的建议。他的意思是使用 Time.now.end_of_day 而不是 Time.now 更好。这样你就可以在其他情况下重复使用这个范围。
    • @Joshua 如果你在 application.rb 中设置了 TimeZone,那么使用 Time.zone.now 而不是 Time.now
    • 我也有点困惑,什么做什么,我希望 00:00 根据用户时区开始。我用哪个?
    【解决方案2】:

    该错误是因为today 是模型的实例方法,而不是范围。

    你需要的是scope:

     scope :today, lambda{ where(:created_at => (Time.now.beginning_of_day..Time.now)) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多