Делать это только с помощью People модели ("легкий" способ):
- Pro: это легко
- Con: это легко для людей, чтобы раздувать свою "победу" на прессовые параметры формы, используя Firebug или Inspection Хрома инструмент
Если у вас есть эти маршруты:
new_person GET /people/new(.:format) {:action=>"new", :controller=>"people"}
edit_person GET /people/:id/edit(.:format) {:action=>"edit", :controller=>"people"}
person GET /people/:id(.:format) {:action=>"show", :controller=>"people"}
PUT /people/:id(.:format) {:action=>"update", :controller=>"people"}
DELETE /people/:id(.:format) {:action=>"destroy", :controller=>"people"}
HAML версия кода вида:
- # Person A form
= form_tag(person_path(@personA, :loser_id => @personB), :method => :put) do
= submit_tag "Vote for Person A"
- # Person B form
= form_tag(person_path(@personB, :loser_id => @personA), :method => :put) do
= submit_tag "Vote for Person B"
ERB Версия:
<%# Person A form %>
<% form_tag(person_path(@personA, :loser_id => @personB), :method => :put) do %>
<%= submit_tag "Vote for Person A" %>
<% end %>
<%# Person B form %>
<% form_tag(person_path(@personB, :loser_id => @personA), :method => :put) do %>
<%= submit_tag "Vote for Person B" %>
<% end %>
Затем в контроллер для update
действия вы могли бы сделать:
def update
People.transaction do
winner = People.find(params[:id])
loser = People.find(params[:loser_id])
# Increment the winner
winner.increment! :matches_played
winner.increment! :wins
# Increment the loser
loser.increment! :matches_played
end
respond_to do |format|
format.html { redirect_to new_match_path }
end
end
Как кто-то указал в комментариях, вы, вероятно, должны это в так называемом transaction, так что он постоянно находится в базе данных, если все транзакции успешно сохраняются.
Несмотря на то, что я показываю вам метод выше, я бы еще рекомендовал использовать Match
модель. В конечном счете, использование этой дополнительной модели поможет вам проверить следующие вещи, чтобы люди не могли играть в вашу систему.
- Пользователь может голосовать только один раз за матч
- Пользователь не может голосовать на матч с участием их
- Пользователь не может подделать форму, чтобы раздуть их победы
проблемы
- Раздельные столь же далеко, как модели идут и сохраняет ваши данные более организованными и понятными для целей аналитики.
Да, для этого требуется больше работы (именно поэтому я не показываю код для нее) беспокоиться о любом из ab ове.
Я бы разложил эту информацию в таблицу 'match' и сделал некоторый SQL для вычисления того, что вы хотите. – Reactormonk