Работа Cron ломает гем make_voteable?

Я столкнулся с очень странной ошибкой с драгоценным камнем make_voteable. На самом деле я даже не уверен, что это связано с make_voteable или это проблема с грабли.

В моем приложении есть модель проекта. Проекты имеют атрибут статуса. Они начинаются как «Разработка», а после достижения установленного срока разработки статус меняется на «Ожидает голосования». Затем пользователи могут голосовать за или против проектов (пока не наступит крайний срок голосования), чтобы расставить приоритеты.

Таким образом, если статус проекта «Ожидает голосования», в представлении проекта отображаются ссылки на следующие действия в моем контроллере проектов:

def vote_yes
  @project = Project.find(params[:id])
  current_user.up_vote(@project)
  flash[:success] = 'Thanks for voting!'
  redirect_to @project
rescue MakeVoteable::Exceptions::AlreadyVotedError
  flash[:error] = 'You already voted!'
  redirect_to @project
end

def vote_no
  @project = Project.find(params[:id])
  current_user.down_vote(@project)
  flash[:success] = 'Thanks for voting!'
  redirect_to @project
rescue MakeVoteable::Exceptions::AlreadyVotedError
  flash[:error] = 'You already voted!'
  redirect_to @project
end

Все прекрасно работает, если я обновляю через терминал срок/статус/voting_deadline или вручную меняю запись в базе данных. Голосование работает, как и ожидалось, при этом up_votes и down_votes сохраняются в соответствующей записи проекта.

Однако, если я запускаю задание cron, которое я настроил, чтобы позаботиться об этом, что является нормальным рабочим процессом приложения, представления отображают ссылки для голосования, пользователи могут щелкнуть их, как обычно, но голосование не сохраняется в таблице проектов. Однако таблица голосования заполняется нормально, и пользователь не может снова проголосовать.

Единственное, что делает задание cron, — это запускает этот фрагмент кода из модели Project:

def self.close_projects
  @finished_projects = Project.where('deadline < ? and status = ?', Time.now.utc, "Developing")
  @finished_projects.each do | project |
    project.update_attribute(:status, "Pending voting")
    project.update_attribute(:voting_deadline, Time.now.utc + 1.week )
  end
end

И последнее наблюдение: я запустил миграцию, чтобы добавить столбец polling_deadline в таблицу проектов после выполнения миграции, которая добавила up/down_votes к той же модели. Я не думаю, что это должно быть проблемой, но, возможно, на это стоит обратить внимание.

Я очень ценю любой вклад.


person rapcal    schedule 25.10.2011    source источник
comment
OT, но рассмотрите возможность рефакторинга этих методов :( Вы проследили код голосования, чтобы увидеть, что происходит?   -  person Dave Newton    schedule 25.10.2011
comment
Спасибо за вклад, Дэйв. Я думаю, что заметил проблему проверки, которая не возникает ни с драгоценным камнем, ни с серверами. И хотя это не по теме, поскольку я только учусь программировать, не могли бы вы указать мне, как реорганизовать код? Извините, что заставил вас смотреть на такие уродливые строки... ;)   -  person rapcal    schedule 26.10.2011
comment
Что-то вроде этого (полностью не проверено :)   -  person Dave Newton    schedule 26.10.2011


Ответы (1)


Оказывается, это была просто ошибка проверки, которая не вызывалась драгоценным камнем. Но это была моя вина, полностью, поскольку проверка должна происходить только при создании, и это происходило и при обновлениях.

Тем не менее, я думаю, что код для драгоценного камня может быть улучшен, указывая на подобные ошибки, поэтому я предоставлю некоторые отзывы на их странице github.

person rapcal    schedule 26.10.2011