嗨,我有一张桌子大师,有很多工作。我试图找出有多少人有一份以上的工作。
我这样做:
a = Master.all.select {|c| c.jobs.count > 0 }
a.count
这是正确的方法吗?
此外,我想查找经常性用户,以便查询每个Master的第一个和最后一个工作,看看它们是否超过一个月。我该怎么办?我很困惑。
Master.all.select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
答案 0 :(得分:2)
嘿,您可以将 a = Master.includes(:jobs).select {|c| c.jobs.count > 0 }
查询删除为:
a = Master.includes(:jobs).group("jobs.id").having("count(jobs.id) > 0")
否则使用数据库查询就像使用此查询一样,它只返回条件记录
includes
对于第二个查询,您可以使用相同的方式添加N+1
以删除 Master.includes(:jobs).select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
查询,这是查找的最佳方式
includes
您可以使用其作业不可用的作业主文件,因为left outer join
使用Master.includes(:jobs).where("jobs.master_id = masters.id").select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
<field name="GOP Structure">
<GOPStructures>
<GOPStructure>
<M value="0" />
<N value="1" />
<coverage value="3.6" />
</GOPStructure>
<GOPStructure>
<Mmax value="3" />
<Mmin value="2" />
<N value="48" />
<coverage value="99.9" />
</GOPStructure>
<GOPStructure>
// so on..
</GOPStructure>
</GOPStructures>
<AverageGOPLength value="48" /> </field>
答案 1 :(得分:1)
你可以尝试简单地
Master.joins(:jobs).group("jobs.id").having("count(jobs.id) > ?",0)
或m etawhere
Master.includes(:jobs).where(:jobs => {:count.gt => 0})
对于第二个查询,您需要Master
来完成其作业的第一个和最后一个日期的差异。
喜欢
class Master < ActiveRecord::Base
has_many :jobs
scope :date_diff, -> {(include(:jobs).where((jobs.first.date - jobs.last.date).to_i > 30) }
end
现在
Master.find(2).date_diff
答案 2 :(得分:0)
Master.includes(:jobs).reject { |m| m.jobs.count == 0 }.count
第二部分。
Master.joins(:jobs).where("DATEDIFF((Select jobs.date FROM jobs where id = (Select MAX(id) FROM jobs)),(Select jobs.date from jobs where id = (Select MIN(id) FROM jobs))) > ?", 30)
答案 3 :(得分:0)
a = Master.joins(:jobs)
所有带作业的母版(在此查询母版中没有作业将被删除)
month_jobs = Master.joins(:jobs).select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }