Rails:根据投球时间长短给予投票权重

时间:2014-10-11 21:50:26

标签: ruby-on-rails ruby date datetime ruby-on-rails-4

我建立了一个投票系统,在我的用户视图中是一个名为" votes"的单独模型的表单,它只包含一个提交按钮。每次按下该按钮,都会创建一个新的投票实例,然后user.vote.count返回总计。但是,我希望更新的选票有更多的权重,所以例如一天前的投票将被计为6票,并且每过一天它就会失去一票,所以在6天后它不会计入所有。我该怎么做呢?

我使用的是Rails 4.0.10

用户控制器

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
    @user.votes.build
    @vote = Vote.new
  end

  def new
    @user = User.new
    @users = User.all
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render 'new'
    end
  end


  private

    def user_params
      params.require(:user).permit(:name)
    end

end

用户模型:

class User < ActiveRecord::Base
  has_many :votes

  def vote
    (self.votes.count )
  end
end

投票控制人:

class VotesController < ApplicationController

  def show
    @vote = Vote.find(params[:id])
  end

  def new
    @user = User.find(params[:user_id])
    @vote = Vote.new
    @votes = Vote.all
  end

  def create
    @user = User.find(params[:user_id])
    @vote = @user.votes.create(vote_params)
    redirect_to user_path(@user)
  end

  private

    def vote_params
      params.permit(:user_id)
    end

end

投票模型:

class Vote < ActiveRecord::Base
  belongs_to :user
end

用户视图:

<%= form_for [@user, @vote] do |f| %>
  <input type="hidden" id="user_id" name="user_id" value="#{@user.id}" />
  <%= f.submit ": )", :onclick => 'alert("Voted up!")' %>
<% end %>

1 个答案:

答案 0 :(得分:1)

如果你正在使用PostgreSQL,它将成为这些方面的东西。

User.votes
  .select('SUM(6 - extract(day from now() - created_at)) as score')
  .where("created_at >= current_date - interval '6' day")

这将获得6天或更短时间的所有投票。然后根据它的年龄(6岁)对每个投票进行评分。最后它需要各个分数的总和。