我正在努力整理一个相当复杂的Active Record查询,而且我对Rails还是个新手。
以下是查询的相关模型关系:
以下是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
的候选人吗?
谢谢!
答案 0 :(得分:5)
尝试这样的事情
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
,而不是一个团队的关系。
答案 1 :(得分:0)
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