私はハッカー ニュースのクローンを作成しました。過去 7 日間に基づいて、最も投票されたものから最も投票されていないものにランク付けする投票システムを実装しようとしています。これを行うための宝石がいくつかあることは知っていますが、宝石を使用する前に一度手動で行いたいと思います。
私が抱えている最初の問題は、複数の投票です。各ユーザーが好きなだけリンクに投票できるようにしたいのですが、リンクごとに 1 票に制限されています。私はこれを実現しようとしましたvotes_controller
が、ユーザーがリンクごとに 1 票を持つのではなく、リンク自体に合計 1 票しか持たないようにしています。これが私の方法ですvotes_controller
:
def create
@vote = Vote.new(voter_params)
if @vote.save
redirect_to links_path, notice: "Thanks for voting!"
else
redirect_to links_path, notice: "Sorry, you can only vote on a link once."
end
end
Myschema.rb
は 、users
、links
で構成され、 との両方にvotes
属性user_id
があり、ここにリストされています。links
votes
create_table "links", force: true do |t|
t.string "description"
t.string "url"
t.datetime "created_at"
t.datetime "updated_at"
t.integer "user_id"
end
create_table "users", force: true do |t|
t.string "name"
t.string "email"
t.string "user_name"
t.string "password_digest"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "votes", force: true do |t|
t.integer "user_id"
t.integer "link_id"
t.datetime "created_at"
t.datetime "updated_at"
end
現在のアクションをリファクタリングして、どのリンクにも投票できるようにするにはどうすればよいですか?
わかりました、私の2番目で最後の質問は、投票の問題を解決したら、過去7日間に基づいて、もちろんpostgresサーバーアプローチを使用して、最も投票されたものから最も投票されていないものにどのように並べ替えることができるかということです. データベースを通過する方が効率的であるように思えます。私が得ることができる洞察をいただければ幸いです、私は完全に困惑しています、ありがとう!!
より良いアイデアを提供するための私のリンクモデルは次のとおりです。
class Link < ActiveRecord::Base
validates :url, :presence => true, :url => true
belongs_to :user
has_many :votes
has_many :comments, :as => :commentable
def self.sort_by_votes
sorted_votes = Link.all.sort_by { |link| link.votes.count }
sorted_votes.reverse
end
end
ここに私の見解があります:
<% if current_user %>
<p style="float:right; padding-right: 10px;"> Logged in as: <%= current_user.name %> </p>
<% end %>
<div class="container" id="content">
<button class="btn btn-default btn-xs" style="float:right"><%= link_to "New Link", new_link_path %></button><br><br>
<table >
<thead>
<tr>
</tr>
</thead>
<tbody class="stories">
<% @links.sort_by_votes.each do |link| %>
<%= form_for link.votes.new do |f| %>
<%= f.hidden_field :link_id %>
<%= f.submit '▲' %>
<% end %>
<%= "#{link.votes.count} votes " %>
<%= link_to link.description, link.url %>
<small><%= "(#{link.url})" %></small>
<span class="date"><%= link.created_at.to_time.strftime("%b %-d, %Y @ %-I:%M%P") %></span>
<br>
<button class="btn btn-default btn-xs">
<%= link_to "Delete", link, :method => :delete, :data => { :confirm => "are you sure about that?" } %>
</button>
<button class="btn btn-default btn-xs">
<%= link_to "Comment", link_path(link)%>
</button><hr/>
<% end %>
</tbody>
</div>