如何查找具有相同孩子数范围的记录(活动记录)

时间:2017-11-10 06:50:13

标签: ruby-on-rails activerecord

我有Area模型,User模型看起来像这样:

区域型号:

Nothing!!!

用户模型:

belongs_to :area, foreign_key: :area_id

现在,我可以通过Area.find(1).users

获得一个区域的大量用户

但是,我怎样才能获得所有拥有1到10个用户的区域,或者所有拥有20到30个用户的区域?

2 个答案:

答案 0 :(得分:1)

您可以使用having子句来实现

Area.joins(:users).group('users.area_id, areas.id').having("COUNT(users.id) BETWEEN 1 and 10")

这将生成

SELECT "areas".* 
FROM "areas" 
INNER JOIN "users" ON "users"."area_id" = "areas"."id" 
GROUP BY users.area_id, areas.id 
HAVING count(users.id) between 2 and 10

以上代码将返回Area条记录,其中关联用户的范围介于1到10之间

注意:您可以根据您的要求更改范围

答案 1 :(得分:1)

使用rails counter_cache选项

class User < ActiveRecord::Base
  belongs_to :area, foreign_key: :area_id, counter_cache: true
end

现在为区域表

创建迁移
create :areas do |t|
  t.integer :users_count
  ---- Your other fields---
end

现在无论何时将userarea对象关联/删除,rails都会自动增加或减少users_count并自动将其存储在area对象中。

您的查询将像以下查询一样简单。

Area.where(users_count: 1..10)