ruby-on-rails - 如何将 Users 表加入 100 条排名记录的列表以避免 100 多个额外的用户查询?

标签 ruby-on-rails ruby postgresql ruby-on-rails-5

我有一个包含以下字段的排名模型:

Ranking.rb
  t.string "job_type"
  t.integer "user_id"
  t.integer "ranking"
  t.integer "total_ranked"
  t.integer "points"

此表由具有约 100 条记录的后台作业填充。然后我想让我的 API 查询并返回存储在排名中的记录的结果,如下所示:

@rankings = Ranking.where(job_type: 'all_users').order('id ASC').select('id, user_id, ranking, points')

问题是我没有每个排名的相关用户信息。对于每个排名,我想使用 user_id 来查找用户并获取 User.displayName、User.photo_url。

如果我遍历@rankings 并对每条记录进行用户查询,那将是额外的 100 多个查询。

我如何使用@rankings 并以某种方式包含关联的用户字段(User.displayName、User.photo_url)?理想情况下使用较少的数据库查询。

最佳答案

您想使用 active record :joins method .假设 users 表也有一个名为 id 而不是 user_id 的字段,这应该有效:

Ranking
  .select('rankings.id, rankings.ranking, rankings.points, users.displayName, users.photo_url')
  .joins('JOIN users ON rankings.user_id = users.id')
  .where(job_type: 'all_users')
  .order('id ASC')`

编辑:我找不到从多个表中选择值的文档,只能堆放旧的溢出答案。因此,如果这不起作用,您可以这样做:

@rankings = Ranking.where(job_type: 'all_users').order('id ASC').select('id, user_id, ranking, points').includes(:user)

这将使用 includes(@thanh 在他的评论中提到,他链接文档也值得一试)。然后,您可以遍历评级并获取 displayNamephoto_url,而无需进行额外的数据库调用。

编辑 2 :) 根据this answer我的第一个答案应该有效,但是由于 :select 返回一个 ActiveRecord::Relation 对象,它只会包含您调用 :select 的类的对象(在我们的例子中 排名)。 User 列将在那些 Ranking 对象上可用。看起来我们还需要为这些用户列起别名,所以像这样:

@rankings = Ranking
  .select('rankings.id, rankings.ranking, rankings.points, users.displayName as user_display_name, users.photo_url as user_photo_id')
  .joins('JOIN users ON rankings.user_id = users.id')
  .where(job_type: 'all_users')
  .order('id ASC')`

然后像这样访问它们:

@rankings.first.user_photo_url #=> "https://flikr.com/whatever"

关于ruby-on-rails - 如何将 Users 表加入 100 条排名记录的列表以避免 100 多个额外的用户查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792891/

相关文章:

sql - 如何用数据将数组更改为jsonb?

javascript - 使用 JavaScript 捕获视频和音频

ruby-on-rails - 如何在没有 ORM 的情况下仅使用低级数据库驱动程序设置 Ruby on Rails 应用程序?

ruby-on-rails - 在 "Sign Up"之后填充数据库

ruby - 如何从命令行重新格式化 ruby​​ 代码?

python - SQLAlchemy:更新 from_select

ruby-on-rails - 如何更改gem的版本?

javascript - application.js 找不到 jquery.ui.effect-blind

ruby-on-rails - 我可以在 Rails 中设置级联删除吗?

postgresql - Postgres 中的索引?