В настоящее время я создаю сайт, который проводит автономные соревнования каждую неделю. В логике у меня есть проверки, если на предыдущей неделе назначена победительница, а если нет, она просматривается, находит победителя и назначает трофей.Правильный метод Rails для многих логик
Логика все работает, но многое из нее выполняется в контроллере приложений, и в моем ядре я чувствую, что это неправильно.
Например, если на первом месте больше голосов, чем на втором месте, а на втором месте больше голосов, чем на третьем месте, ему нужно будет создать трофей первого и третьего места и вознаградить его за правильных пользователей.
if first_place > second_place && second_place > third_place
@week_previous.winner_id = week_entries[0].id
@week_previous.save
first_trophy = week_entries[0].user.trophies.new
first_trophy.week_id = @week_previous.id
first_trophy.user_id = week_entries[0].user_id
first_trophy.position = "first"
first_trophy.country = week_entries[0].user.country
first_trophy.pro = false
first_trophy.save
if second_place >= 1
second_trophy = week_entries[1].user.trophies.new
second_trophy.week_id = @week_previous.id
second_trophy.user_id = week_entries[1].user_id
second_trophy.position = "second"
second_trophy.country = week_entries[1].user.country
second_trophy.pro = false
second_trophy.save
end
if third_place >= 1
third_trophy = week_entries[2].user.trophies.new
third_trophy.week_id = @week_previous.id
third_trophy.user_id = week_entries[2].user_id
third_trophy.position = "third"
third_trophy.country = week_entries[2].user.country
third_trophy.pro = false
third_trophy.save
end
end
Это строит соревнования прямо в контроллер, и я часто слышал «жира модели тощий контроллер» аргумент, и я чувствую, как я бегу это идет полностью против этого!
Как перенести творения трофеев в модель? Я уверен, что я мог бы использовать что-то вроде after_save
в модели недель, но я не совсем уверен, как сохранить работу логики. У меня было несколько попыток, но я часто получаю ошибку undefined method to_model
.
Я знаю, что я мог бы просто пахать и заставить его работать, но я просто чувствую, что это не «Rails Way», чтобы делать что-то, поэтому я хотел бы разобраться на ранних этапах.
Любая помощь очень ценится.
Спасибо!
Редактировать на основе комментариев:
Спасибо, что нашли время, чтобы посмотреть на это. В ореховой раковине я пытаюсь добиться того, чтобы система проходила с понедельника по воскресенье. «Активная неделя» привязана к Неделе, где Date.today находится между: start_date и: end_date.
В следующий понедельник начинается новая неделя, это перемещает то, что было активной неделей на предыдущую неделю, и затем выделяет трофеи в верхние 3 записи за предыдущую неделю. Он выделяет трофеи, проверяя, имела ли предыдущая неделя значение winner_id. Если это так, он не запускает какую-либо логику, но после того, как область движется на новую неделю, предыдущие недели: winner_id теперь нуль, поэтому логика запускается в первый раз, когда кто-то приходит на сайт в новую неделю.
немой вниз:
- Неделя является ресурсом, который записи has_many.
- Запись принадлежит _ пользователю, принадлежит_не недели и has_many Голоса.
- вотума belongs_to въездного
- Пользователь, has_many Запись и has_many Трофеи
- трофей принадлежит Пользователю и belongs_to Недели
Таким образом, пользователям голосовать на записи в текущей активной неделе. Как только неделя выходит за пределы активной области, она создает Trophies для Пользователей, которые помещаются в верхние 3 позиции недели.
Вы правы, что это должно быть в модели. Похоже, что его нужно немного подобрать. Можете ли вы добавить дополнительную информацию о своей схеме и о том, что вы пытаетесь сделать? –
Я внес некоторые изменения и привязаны к репо. Надеюсь, это будет иметь больше смысла! Я должен извиниться, поскольку я буквально работал в линейной логике в контроллере приложений, чтобы заставить все работать. – abbott567
Это вопрос, который больше по теме на http://codereview.stackexchange.com –