0

したがって、post_id によって投票が投稿に関連付けられる投稿モデルと投票モデルがあります。

投稿モデル

class Post < ActiveRecord::Base
  attr_accessible :comment_count, :downvote, :id, :text, :title, :upvote, :url, :user_id, :users_voted_up_by, :users_voted_down_by

  serialize :users_voted_up_by
  serialize :users_voted_down_by

  belongs_to :user

  has_many :votes
end

投票モデル

class Vote < ActiveRecord::Base
  attr_accessible :direction, :post_id, :type, :voter_id

  belongs_to :user

  belongs_to :post

  belongs_to :comment
end

ループ内の現在の投稿Votesを持つテーブル内のすべての行について、データベースにクエリを実行する必要があります。post_id

<% @posts.each do |post| %>
    <%= Vote.count(:post_id, params[:post_id]) %>
<% end %>

しかし、それはすべての行をカウントするだけです。それらを関連付けるために何を書くことができますか?

4

1 に答える 1

3

推奨されるアプローチは、クエリでグループ化を使用することです。

<% vote_counts = Vote.group(:post_id).
        where(:post_id => @posts.map(&:id)).count %>
<% @posts.each do |post| %>
  <%= post.id %>: <%= vote_counts[post.id] || 0 %>
<% end %>

グループ化されたクエリの利点は、データベースに1回だけヒットすることです。計り知れない理由で投稿ごとに1つのカウントを取得したい場合は、次のように使用できます。

<% @posts.each do |post| %>
  <%= post.id: %> <%= post.votes.count %>
<% end %>

ただし、2番目の方法の単純さに惑わされないでください。N + 1パターンが含まれているため、問題が発生しています。

于 2013-01-10T19:38:26.557 に答える