Rails:如何在条件中查询连接表

时间:2016-03-04 05:53:42

标签: ruby-on-rails

嗨,我有一张桌子大师,有很多工作。我试图找出有多少人有一份以上的工作。

我这样做:

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 }

4 个答案:

答案 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 }