Ruby on rails Rails:如何在具有条件的联接表中进行查询

Ruby on rails Rails:如何在具有条件的联接表中进行查询,ruby-on-rails,Ruby On Rails,嗨,我有一个有很多工作的桌子主人。我想知道有多少人有一份以上的工作 我正在这样做: a = Master.all.select {|c| c.jobs.count > 0 } a.count 这是正确的方法吗 此外,我还想找出经常性的用户,所以我想查询每个硕士的第一份和最后一份工作,看看他们是否超过一个月。我该怎么做?我很困惑 Master.all.select {|c| (c.jobs.last.date - c.jobs.first.date > 30 } 第二部分 Mast

嗨,我有一个有很多工作的桌子主人。我想知道有多少人有一份以上的工作

我正在这样做:

a = Master.all.select {|c| c.jobs.count > 0 }
a.count
这是正确的方法吗

此外,我还想找出经常性的用户,所以我想查询每个硕士的第一份和最后一份工作,看看他们是否超过一个月。我该怎么做?我很困惑

Master.all.select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
第二部分

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)

嘿,您可以删除您的
N+1
查询,如下所示:

 a = Master.includes(:jobs).select {|c| c.jobs.count > 0 }
否则,使用数据库查询就像使用此查询一样,它只返回条件记录

 a = Master.includes(:jobs).group("jobs.id").having("count(jobs.id) > 0")
对于第二个查询,您可以使用相同的方法,只需将
包含
添加到删除的
N+1
查询,这是查找

 Master.includes(:jobs).select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
您可以用于其作业不可用的作业主控,因为
包括
使用
左外联接

Master.includes(:jobs).where("jobs.master_id = masters.id").select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }
你可以简单地试试

 Master.joins(:jobs).group("jobs.id").having("count(jobs.id) > ?",0)
或者m

对于第二个查询,您需要一个
Master
来完成其作业的第一个和最后一个日期之间的差异

具有作业的所有主控形状(在此查询中,没有作业的主控形状将被删除)


@Rubysmith这个查询有效吗<代码>作业。
中不允许计数,其中
条款请给出正确答案??因为
where
不允许任何类型的
aggregate
函数。@VishalJAIN看到宝石了吗请在Arel Way中的metawhere我怎么会得到命名呢Derror:nil的未定义方法'date'nil:nilclasst发生在某些主机没有作业时,所以master.jobs.last或first是nil,我能做什么呢“ActiveRecord::StatementInvalid:PG::UndefinedTable:错误:表“jobs”的子句条目中缺少@ShinonChan它工作正常只需验证您的表名Hey
连接
不支持
急切加载
使用的
包含
条件
 Master.joins(:jobs).group("jobs.id").having("count(jobs.id) > ?",0)
 Master.includes(:jobs).where(:jobs => {:count.gt => 0})
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
  a = Master.joins(:jobs)
 month_jobs =  Master.joins(:jobs).select {|c| (c.jobs.last.date - c.jobs.first.date > 30 }