我在使用一個查詢提取資料時遇到問題。我的兩個模型看起來像這樣:
# 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
我想把每一個school通過的地方User都有少于 2 次的 status 會議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 和 EAdam
uj5u.com熱心網友回復:
我認為您需要在這里扭轉您的想法:從結果中獲取您想要排除的學校,而不是嘗試在您的查詢中添加額外的學校。像這樣的東西:
# 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)避免觸發新的資料庫查詢,因此在方法中使用時,所有這些都應該只需要 1 個資料庫查詢。當然,如果您想在 1 個查詢中完成所有操作,則必須在控制臺中嵌套這些而不是存盤在變數中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497361.html
標籤:sql 轨道上的红宝石 红宝石 活动记录 ruby-on-rails-6
上一篇:使用強引數創建多條記錄
