Rails Active Record连接查询与排序和限制
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails Active Record连接查询与排序和限制相关的知识,希望对你有一定的参考价值。
我正在尝试将一个相当复杂的Active Record查询放在一起,我对Rails相当新。
关系
以下是查询的相关模型关系:
- 团队可以有很多用户。
- 用户有一个team_id列来跟踪他们所在的团队。
- 团队有一个管理员,这是一个用户。这是在团队的admin_id列中。
- 用户有一个电子邮件地址(例如foo@example.com)。
架构
以下是schema.rb
的相关部分:
create_table "teams", force: :cascade do |t|
t.integer "admin_id"
end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.integer "team_id"
end
add_foreign_key "teams", "users", column: "admin_id"
add_foreign_key "users", "teams"
询问
给定一个域名(例如example.com),我想找到管理员拥有该域名的电子邮件地址的团队。如果有多个匹配,我想只有拥有最多用户的团队。这是我到目前为止所拥有的:
team = Team.joins('INNER JOIN users ON admin_id = users.id')
.where('email LIKE ?', "%example.com")
.where(domain_sign_up: true)
问题
此查询的问题是它将所有匹配作为数组返回。我想通过team.users.count
订购它,然后只返回第一个(用户最多)团队作为对象,而不是数组。这可能是LEFT OUTER JOIN
的候选人吗?
谢谢!
答案
尝试这样的事情
team = Team.joins('INNER JOIN users ON admin_id = users.id')
.where('email LIKE ?', "%example.com")
.where(domain_sign_up: true)
.group('teams.id')
.select('teams.*, COUNT(users.id) AS team_users_count')
.order('COUNT(users.id) DESC')
.first
我把limit(1)
换成了first
。如果参数为1,它似乎没有多大意义limit
,所以你有一个Team
,而不是一个团队的关系。
另一答案
Ursus发布的答案非常有用,但是我最后在团队中添加了一个新的专栏来简化事情,然后使用.left_join
来订购。这是我的最终查询:
team = Team.left_joins(:users)
.where(domain: 'example.com', domain_sign_up: true)
.group('teams.id')
.order('COUNT(users.id) DESC')
.first
以上是关于Rails Active Record连接查询与排序和限制的主要内容,如果未能解决你的问题,请参考以下文章
Postgres / Rails Active Record - 查询四舍五入的浮点值
Rails 4 - 从已过滤的 Active Record 查询中删除属性
在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询