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

标签 postgresql ruby-on-rails-4 voting

在包含大量帖子的页面上向用户显示他的投票类型(赞成/反对/弃权)的最佳方法是什么?

直接查询就是

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)

rails 中是否有内置的“magick”方法?我使用 postgresql。

UPD +1 相同的写法

current_user.votes.find_by_post_id(post.id)

UPD2 Dummy-table on pastebin

最佳答案

怎么样

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]]

关于postgresql - 使用 Rails 获取数百个帖子的当前用户投票类型的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20939277/

相关文章:

postgresql - Postgres : create table in database from the command line

java - 服务器请求基于 SCRAM 的身份验证,但未提供密码

ruby-on-rails - ldap 设备中的多个组可验证

ruby-on-rails - Rails 4 radio_button_tag 默认未选中

受IP限制的PHP+MySQL投票系统

postgresql - 如何查找从 db.Query postgres 返回的行数

python - Postgres FATAL 数据库不存在 Django

ruby-on-rails - 使用路由约束时设计错误

ruby-on-rails - Ruby on Rails - 每月最高票数

php - 关于 AJAX/PHP 投票系统和 Amazon Mechanical Turk 的假设问题