首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails 4范围用于查找没有子代的父代

Rails 4范围用于查找没有子代的父代
EN

Stack Overflow用户
提问于 2013-08-06 21:49:56
回答 3查看 18.2K关注 0票数 38

我发现了一个answer,它有一些有用的having示例,用于查找具有n孩子的父母,但同样不能用于查找没有孩子的父母(可能是因为连接排除了他们)。

代码语言:javascript
运行
复制
scope :with_children, joins(:children).group("child_join_table.parent_id").having("count(child_join_table.parent_id) > 0")

有谁能给我指个方向吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-06 21:51:56

Rails 3和4

代码语言:javascript
运行
复制
scope :without_children, includes(:children).where(:children => { :id => nil })

这里最大的区别是包含变成了一个包含:一个包含加载所有的关系,如果它们存在,joins将只加载相关的对象,而忽略没有关系的对象。

事实上,scope :with_children, joins(:children)应该足以返回至少有一个子代的父代。试试看!

Rails 5

请看下面@Anson的答案

Gem activerecord_where_assoc

对于Rails4.1到6.0,activerecord_where_assoc gem都可以做到这一点。

代码语言:javascript
运行
复制
scope :without_children, where_assoc_not_exists(:children)

自引用关系被无缝地处理。

这也避免了诸如joins使查询返回单个记录的多行之类的问题。

正如@MauroDias指出的那样,如果你的父母和孩子之间是一个自我引用的关系,上面的代码将不会工作。

通过一些研究,我发现了如何做到这一点:

考虑这个模型:

代码语言:javascript
运行
复制
class Item < ActiveRecord::Base
  has_many :children, :class_name => 'Item', :foreign_key => 'parent_id'

如何返回没有子项的所有项(Ren):

代码语言:javascript
运行
复制
Item.includes(:children).where(children_items: { id: nil })

我是怎么找到那个children_items表的?

Item.joins(:children)生成以下SQL:

代码语言:javascript
运行
复制
SELECT "items".* 
FROM "items" 
 INNER JOIN "items" "children_items" 
 ON "children_items"."parent_id" = "items"."id"

因此,我猜测Rails在自引用情况下需要连接时会使用表。

类似问题:

票数 72
EN

Stack Overflow用户

发布于 2016-11-10 00:04:03

@MrYoshiji有一个可靠的Rails 4答案,但对于那些使用Rails 5的人来说,你有更多的选择。

使用Rails 5的

从Rails5开始,您还可以使用left_outer_joins来避免加载关联。它是在拉取请求#12071中引入的。

代码语言:javascript
运行
复制
scope :without_children, -> { left_outer_joins(:children).where(children: { id: nil }) }

对于有孩子的父母,MrYoshiji先生的Rails 4解决方案仍然是可以使用的:

代码语言:javascript
运行
复制
scope :with_children, -> { joins(:children).uniq }
票数 29
EN

Stack Overflow用户

发布于 2018-05-29 20:02:41

这就是我为Rails5解决这个问题的方法:

代码语言:javascript
运行
复制
scope :without_comments, -> do
  left_outer_joins(:comments).where(comments: { id: nil })
end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18082096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档