如何根据在Postgresql中传递某些条件的所有相关子项选择父项

时间:2016-11-21 07:39:32

标签: ruby-on-rails postgresql activerecord

我有一个有很多孩子的父类。孩子们在date_time列中保存重要的时间信息。如果孩子们都通过了我定义为min(children.start_time) > ? AND min(children.start_time) < ?, Time.now, Time.now.end_of_month + 2.month的所需条件,我该如何选择父记录

我尝试了许多解决方案,这些解决方案都给了我错误的数据。我尝试过的一个例子:

Parent.where(is_active: true).joins("LEFT JOIN children ON parents.id = children.parent_id").group("parents.id").group("children.start_time").having("min(children.start_time) > ? AND min(children.end_time) < ?", Time.now, Time.now.end_of_month + 2.month)

这个查询让我回到父母那里,孩子们在Time.now之前的开始日期不是我所追求的。

任何指针都会非常感激。

2 个答案:

答案 0 :(得分:1)

答案是:

Parent.where(is_active: true).joins(:children).group("parents.id").having("min(children.start_time) > ? AND min(children.end_time) < ?", Time.now, Time.now.end_of_month + 2.month)

答案 1 :(得分:0)

现在是使用scope方法的好时机。

首先,在您的子课程中创建scope(:near_start, -> { where('min(start_time) > ? AND min(start_time) < ?, Time.zone.now, 2.months.from_now) })

min

(这两个标准真的应该是Parent.joins(:children).merge(Child.near_start) 吗?

group

我现在没有任何好的例子可以测试,所以我不能100%确定你需要确保它检查所有孩子,我想可以用{完成{1}}和/或having

我希望它能引导你一点。