如何在Rails中验证时间?限制用户每天发布一次

时间:2011-03-29 03:38:36

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

我正在尝试将用户的帖子限制为每天一次,我正在考虑检查Time.now - last_post_time是否为< (一天中的第二个)但是那会在每个帖子之间强制推迟24小时。

我想做的只是在这个月每天允许一个帖子,所以如果用户在3月28日发帖,他就不能再发帖到29日。但如果他在3月28日晚上10点发布,他可以在3月29日上午12:01再次发布。

我该怎么做?

编辑:

这是我的posts_controller,我可以获得一些关于如何重构这个的帮助吗?

def create
    @post  = current_user.posts.build(params[:supportpost])
        if @post.save
          flash[:success] = "Your post was created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'pages/home'
        end
    end

我正在尝试这样的事情,但肯定是错的:

  def create
    post = @user.posts.find(:first, :conditions => ["STRFTIME('%d', created_at) = ?", Date.today.day])
      if post
       @post  = current_user.posts.build(params[:supportpost])
        if @post.save
          flash[:success] = "Your post was created!"
          redirect_to root_path
        else
          @feed_items = []
          render 'pages/home'
        end
    end

2 个答案:

答案 0 :(得分:5)

我可能会在Post模型的验证中添加此检查。也许是这样的:

class Post < ActiveRecord::Base
  ...

  validate :date_scope

private
  def date_scope
    if Post.where("user_id = ? AND DATE(created_at) = DATE(?)", self.user_id, Time.now).all.any?
      errors.add(:user_id, "Can only post once a day")
    end
  end
end

答案 1 :(得分:2)

post = @user.posts.find(:first, :conditions => ["DATE(created_at) = DATE(?)", Time.now])
if post
  # he made a post today!
else 
  #he can post
end

总而言之,它产生了这个SQL查询:

 SELECT `posts`.* FROM `posts` WHERE (`posts`.user_id = 1) AND (DATE(created_at) = DATE('2011-03-29 04:35:45')) LIMIT 1