0

我正在 Rails 3(和 Ruby 1.9.2)中构建一个应用程序,它接受来自多个用户的提交。该应用程序会在 X 时间后关闭提交窗口。然后,每个人都要对提交的内容进行投票(赞成/反对)。在 Y 时间后,得票最多的人“获胜”,然后重复该过程。

我是一个菜鸟,但我已经构建了包含提交、RESTful 路由、使用 Devise 的用户身份验证等的基本模型。但是现在我的经验已经用完了,我不太确定构建“持有”系统,该系统将倒计时,直到没有票被接受并选出获胜者。我想我会创建一个投票对象,这样每次提交可以有很多票。但似乎可能需要在后台启动某些东西,以便在投票的计时器用完后唤醒并说:“好的,这个投票期已经结束,现在将获胜者移入数据库并在下一轮投票之前开始接受新的提交”。这是正确的还是可以比这更简单?

关于我应该如何思考这个概念的任何建议?

谢谢!!

4

2 回答 2

1

所以你有某种Ballot模型。Ballot有很多Submissions,提交有很多Votes。还有一个WinningSubmission模型。Ballot有一个WinningSubmission

我认为Ballot包含 X 和 Y 的时间戳可能是最简单的。

如果您不希望有一些 cron 作业来轮询已完成投票,您可以运行一个通用before_filter输入ApplicationController(或者,最好为这个过滤器创建一个空白控制器,并让其他管理投票的控制器继承从中)检查每个请求以查看是否有任何选票已关闭,但也没有获胜者;然后在继续请求之前计算获胜者。它就像一个工作人员,只是它在网络服务器中,所以它增加了一些响应延迟。

至于提交和投票的控制器/视图架构create,我可能会有三次嵌套控制器:

resources :ballots do       # These blocks may need to pass in their object 
                            # depending on your rails version.

  resources :submissions do 
    # POST to ballot_submissions_path(@ballot) creates subs's.

    resources :votes # POST to ballot_submission_votes_path(@b, @s) creates votes.
  end 
end 

我必须更多地了解您的交互设计,以帮助“创建”操作之外的任何视图/ajax 级别交互,但我猜你要么在投票提交时采用单页索引样式设计级别,或者使用一系列视图,每个状态对应一个选票。#index为了简单起见,这些可能会散布在各个控制器的操作中。

如上所述,如果您不想使用 cronjob 或工作人员,我将拥有BallotsController, SubmissionsController,并且VotesController< BallotCompleterController像这样:

class VotesController < BallotCompleterController
#your vote handling actions would go here.
end

class BallotCompleterController < ApplicationController
  before_filter :complete_unfinished_ballots
  protected
  def complete_unfinished_ballots
     Ballot.expectant.calculate_all!
  end
  #and that's all that's in here
end

class Ballot < ActiveRecord::Base
  #...has_many etc's
  named_scope :expectant, lambda{ 
   {:select => "ballots.*",
    :conditions => ['votes_until < ? and winning_submissions.id is null', Time.current],
    :joins => 'left outer join winning_submissions 
               on winning_submissions.ballot_id = ballots.id', 
    :readonly => false} }

 def self.calculate_all!
   self.each(&:'calculate_winning_submission!') 
 end

 def calculate_winning_submission!
   #calc and save the winning_submission for this ballot
 end

end
于 2011-03-21T18:50:40.287 回答
0

我认为您不需要后台任务——相反,只需一个 AJAX 轮询器即可刷新页面并在准备好时显示投票表单。

因此,您的提交仅在有效时间内接受投票(特别是投票验证 Time.now 在提交开始/结束时间之间)。这将使您的数据保持完整。

然后在您的 HTML 上,首先让您的页面每分钟刷新一次,然后让它仅在有效时间开始时刷新(并在结束时再次刷新)。

于 2011-03-21T17:52:45.330 回答