假设我有一个与两个人相互匹配的应用程序,有点像“热门与否”。
我的比赛视图将随机用户拉出数据库并将它们相互匹配。当用户为其中一个人投票时,我希望将:wins
和:matches_played
增加1,但我还想将失败者:matches_played
增加1,以便我可以计算排名
是否有办法为每个人使用表单来完成此操作,或者我需要一个模型介于两者之间,比如匹配,其中有两列用于赢家和输家,如果是,那么这将如何工作。
答案 0 :(得分:3)
仅使用人模式(“简单”方式)执行此操作:
假设你有这些路线:
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
模型。最终,使用这个额外的模型将帮助您验证以下内容,以便人们无法对您的系统进行游戏。
是的,这一切都需要更多的工作(这就是为什么我没有为它显示代码),但如果你担心上述任何一个,那么你可能想要这样做。
答案 1 :(得分:0)
您应该编写表单提交,将两个用户ID提交给您的控制器,并指示获胜用户。然后你可以对它们进行操作并将它们保存到db。
winner = People.find(params[:winner_id])
loser = People.find(params[:loser_id])
winner.matches_played += 1
winner.wins += 1
loser.matches_played += 1
winner.save!
loser.save!