我有一个问题,提取数据与一个查询。我的两个模型是这样的:
# school.rb
class School < ActiveRecord::Base
has_many :meetings
end
# meetings.rb
class Meeting < ActiveRecord::Base
belongs_to :school
belongs_to :user
# fields
# status: [accepted, not_accepted, finished]
en
我想取每个通过User
的school
少于2次与状态finished
的会议。我正在尝试这样做:
School.joins(:meetings).where(meetings: { user: User, status: 'finished' }).group(:id).having( 'count(meetings.id) < 2')
但如果User
在每个学校有一个完成的会议。我想知道是否有可能用一个查询来解决这个问题?也许你们中的一些人知道这是否可能以及如何做到?
@Edit下面是一个更容易理解我想要接收的内容的示例:
School | User | Meeting
1. A | Adam | finished
2. A | Adam | accepted
3. A | Adam | finished
4. B | Adam | accepted
5. C | John | finished
6. D | - | -
7. E | John | finished
所以我想创建查询,它将返回学校B, C, D和E为用户Adam
我认为你需要在这里扭转你的想法:得到你想要的学校排除从结果,而不是试图添加额外的查询。像这样:
# Get schools with more than 1 meeting for the user
excluded_schools = School.joins(:meetings)
.where(meetings: { user: User, status: 'finished' })
.group(:id)
.having('count(meetings.id) > 1')
# Get ALL schools except for the ones you didn't want
filtered_schools = School.where.not(id: excluded_schools.select(:id))
使用select(:id)
而不是pluck(:id)
避免触发新的数据库查询,所以当在方法中使用时,所有这些都应该只需要一个数据库查询。当然,如果你想在一个查询中完成所有的事情,你必须在控制台中嵌套这些而不是存储在变量中。