使用Rails获取数百个帖子的当前用户投票类型的最佳方法

时间:2014-01-05 21:14:56

标签: postgresql ruby-on-rails-4 voting

在包含大量帖子项目的页面上向用户显示其投票类型(for / against / abstain)的最佳方法是什么?

直接查询

SELECT vote_type FROM votes WHERE post_id = 888 AND user_id = 888

直接使用rails

post.votes.where(:user_id => current_user.id).pluck(:vote_type).first

但是对于每个帖子进行数据库查询都太沉重和愚蠢。

我可以构建posts_id数组并进行一次查询

@posts.each do |post|
  ids << post.id
end
votes = Vote.select(:post_id, :vote_type).where(:user_id => current_user.id, :post_id => ids)
SELECT post_id, vote_type FROM votes WHERE user_id = 888 AND post_id IN (887, 888, 889)

轨道中是否有内置的“魔法”方法?我使用postgresql。

UPD +1相同的写法

current_user.votes.find_by_post_id(post.id)

UPD2 Dummy-table on pastebin

2 个答案:

答案 0 :(得分:0)

@posts = Post.all.includes(:votes).where(posts: { user_id: current_user.id })

答案 1 :(得分:0)

怎么样

votes = Post.
  joins(:user).
  joins("LEFT JOIN votes ON votes.post_id = posts.id AND votes.user_id = 1").
  select("posts.id, posts.title, users.id AS users_id, votes.vote_type")

votes.map {|p| [p.id, p.title, p.users_id, p.vote_type] }

我得到了

[[1, "Say hello", 1, nil], [2, "Amazing world", 2, 1]]