检查以下部分是与模型相关的部分:
ALL_STATUS = ['approved', 'pending', 'processing', 'declined', 'rejected']
#agent.rb
has_many :reports
has_many :assessments, through: :reports
#report.rb
has_many :assessments
belongs_to :agent
#assessment.rb
belongs_to :agent
Those are my sample records in DB.
#agent
id name
1 Alex
2 Justin
3 Clark
4 Mike
#reports
id agent_id status
1 1 approved
2 1 pending
3 1 processing
4 1 rejected
#assessment
id report_id agent_id status
1 1 1 approved
2 3 1 processing
3 2 1 pending
4 4 1 rejected
经社部:
我正在使用下面的代码来获取代理ids。
eligible_agents = []
result = Agent.joins(:reports, :assessments)
result.each do |agent|
if(agent.reports.pluck(:status).count !=agent.assessments.pluck(:status).count)
eligible_agents.push agent.id
end
end
在这里,问题是显而易见的,如果报告/评估的数量增加,那么在条件内查询是否会多次运行。
我们在这里有什么更好的解决方案?
发布于 2014-11-21 21:16:32
以下内容将返回任何没有评估的代理:
Agent.where.not(id: Assessment.all.pluck(:agent_id))
这就是你要找的吗?
如果只需要代理If:
Agent.where.not(id: Assessment.all.pluck(:agent_id)).pluck(:id)
发布于 2014-11-21 19:58:08
与其通过Agent
,不如获取所有没有相关评估的报告。然后从名单上拿起agent_ids。我认为joins
在默认情况下会执行内部连接,因此您需要指定左联接条件,并过滤缺少评估的内容。然后你就可以pluck(:agent_id)
了。
https://stackoverflow.com/questions/27066964
复制相似问题