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 }