所以我知道如何查找所有没有子记录的父记录。
Parent.joins(:child).where(child: {id: nil})
但是,如何查找最近30天内没有创建子级的所有父级记录。我尝试了以下操作,但没有成功
Parent.joins(:child).where(child: {id: nil, created_at: 30.days.ago...Time.current})
Parent.joins(:child).where(child: {created_at: 30.days.ago...Time.current).where(child: {id: nil})
他们俩都没有工作。有什么想法吗?
答案 0 :(得分:2)
您应该可以使用where.not
:
更新:即使没有孩子也要获取所有记录,请使用left_outer_joins
:
# from:
# Parent.joins(:child).where.not(child: { created_at: 30.days.ago...Time.current } )
# to:
Parent.left_outer_joins(:child).where.not(child: { created_at: 30.days.ago...Time.current } )
这很容易解释,绘制了所有不符合标准的记录。
为解释joins
和left_outer_joins
之间的区别,我将使用another question中的引号,因为它们的解释是完美的:
INNER JOIN:两个表中都匹配时返回行。
左联接:即使右表中没有匹配项,也返回左表中的所有行。
因此,您想要后者以便包括没有孩子的父记录。
希望有帮助-让我知道您的生活状况或有任何疑问:)
答案 1 :(得分:2)
您将需要内部查询来执行所需的操作。一种方法:
Parent.where.not(id: Parent.joins(:child).where(child: { created_at: 30.days.ago...Time.current }).pluck(:id).uniq)
这将选择30天内没有孩子的所有父母。希望有帮助。
编辑:
它可以分为两个简单的查询:
unwanted_parents_ids = Parent.joins(:child).where(child: { created_at: 30.days.ago...Time.current }).pluck(:id).uniq
wanted_parents = Parent.where.not(id: unwanted_parents_ids)