我有Area
模型,User
模型看起来像这样:
区域模型:
Nothing!!!
用户模型:
belongs_to :area, foreign_key: :area_id
现在,我可以通过Area.find(1).users
获得一个区域的多个用户
但是,我如何获得所有有1到10个用户的区域,或者所有有20到30个用户的地区?
使用轨道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
现在,无论何时将user
与area
对象关联/删除,rails都会自动增加或减少users_count并将其存储在area
对象中。
您的查询将与以下查询一样简单。
Area.where(users_count: 1..10)
您可以利用have子句来实现
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之间
注意:您可以根据自己的要求更改范围