Итак, у вас есть какая-то модель Ballot
. Ballot
имеет много Submission
с, отправка имеет много Vote
с. Также есть модель WinningSubmission
. Ballot
has_one WinningSubmission
.
Я думаю, что, вероятно, проще всего Ballot
содержать временные метки для X и Y.
Если вы не хотите, чтобы какое-то задание cron опрашивало заполненные бюллетени для голосования, вы можете запустить общий before_filter
в ApplicationController
(или, предпочтительно, создать пустой контроллер только для этого фильтра, и другие контролеры, управляющие голосованием, наследуют его), который проверяет каждый запрос на наличие закрытых бюллетеней, но также не имеет победителей; затем подсчитайте победителей, прежде чем продолжить с запросом. Это похоже на работу работника, за исключением того, что он находится внутри веб-сервера, поэтому добавляет небольшую задержку ответа.
Что касается архитектуры Controller / View того, как представления и голоса являются create
d, я бы, вероятно, имел три вложенных контроллера:
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, кроме действий 'create', но я предполагаю, что вы либо воспользуетесь дизайном стиля индекса на одной странице в уровень представления бюллетеней или серия представлений, по одному для каждого состояния, в котором может находиться бюллетень. Для простоты они, вероятно, будут разбросаны по действиям #index
различных контроллеров.
Как и выше, если вы не хотите использовать cronjob или наемного работника, у меня будет BallotsController
, SubmissionsController
и VotesController
all < 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