0

投票システムを作ろうとしています。投票されているモデルは課題であり、私は issue_id と 0 または 1 の投票値を保持する Vote と呼ばれる別のモデルを持っています。投票は非表示フィールドを持つフォームで作成されています。これは問題のインデックス ビューにあります。

<h1>Votes</h1>

<% @issues.each do |issue| %>
<li>
    <div class="issue">
        <h2><%= issue.title %></h2>
        <p><%= issue.body %></p>

        <%= form_for(@vote, :remote => true) do |f| %>
        <%= f.hidden_field "issue_id", :value => issue.id %>
        <%= f.hidden_field "vote", :value => 1 %>
        <%= submit_tag "Up", :class => 'up-vote' %>
        <% end %>


        <%= form_for(@vote, :remote => true) do |f| %>
        <%= f.hidden_field "issue_id", :value => issue.id %>
        <%= f.hidden_field "vote", :value => 0 %>
       <%= submit_tag "Down", :class => 'down-vote' %>
        <% end %>

    </div>
</li>
<% end %>

課題と投票の間には、has_many と belongs_to の関係があります。各号のボタン横に賛成票と反対票の数を表示したい。したがって、それぞれの問題について、vote = 1 のすべての投票と、vote = 0 のすべての投票を取得し、それぞれをカウントする必要があります。総投票数も知りたいです。どうすればいいですか?私は、投票モデルの課題の関連付けと、課題スキーマの votes_count 列に counter_cache を設定しています。この作業はコントローラーまたはモデルで行う必要がありますか?

4

3 に答える 3

1

私は自分で試したことはありませんが、次のIssueようにモデルにいくつかのメソッドを追加してみてください。

def upvote_count
  votes.count(:conditions => "value = 1")
end

def downvote_count
  votes.count(:conditions => "value = 0")
end

Railsのドキュメントでこれを学びました。ここで自分の目で確かめてください:

http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html http://apidock.com/rails/ActiveRecord/Associations/CollectionAssociation/count

于 2012-09-30T23:25:36.803 に答える
1

ActiveRecord には、count必要なことを行うメソッドがあります: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-count

たとえば、コントローラーで次のようにします。

@upvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id} AND value = 1")
@downvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id} AND value = 0")
@allvotes_count = Vote.count(:conditions => "issue_id = #{@issue.id}")
于 2012-09-30T23:24:13.583 に答える
1

投票を独自に保存する必要は本当にありますか? 他に制約がない場合は、 と の 2 つのフィールドupvotesを使用しdownvotesます。次に、対応するフィールドを 1 ずつ更新する「upvote」と「downvote」という 2 つのアクションを定義します。

(モデル)

class Issue < AR::Base

  def self.upvote(id)
    self.where(:id => id).update_all("upvotes = upvotes + 1")
  end

  def self.downvote(id)
    self.where(:id => id).update_all("downvotes = downvotes + 1")
  end

end

(コントローラ)

class IssuesController < ApplicationController

  def upvote
    Issue.upvote(params[:id])
  end

  def downvote
    Issue.upvote(params[:id])
  end

end

(ルーター)

resources :issues do
  member do
    post :upvote
    post :downvote
  end
end

(ビュー - ハムル)

= form_tag upvote_issue_path(@issue) do
  = submit_tag "Up"
= form_tag downvote_issue_path(@issue) do
  = submit_tag "Down"
于 2012-10-01T00:50:53.610 に答える