gpt4 book ai didi

ruby-on-rails - Rails 4 范围可以找到没有 child 的 parent

转载 作者:行者123 更新时间:2023-12-03 08:11:43 26 4
gpt4 key购买 nike

我找到了一个 answer有一些可用的 having使用 n 查找 parent 的示例 child ,但同样不能用于查找没有 child 的 parent (大概是因为加入排除了他们)。

scope :with_children, joins(:children).group("child_join_table.parent_id").having("count(child_join_table.parent_id) > 0")

任何人都可以指出我正确的方向吗?

最佳答案

rails 3 和 4

scope :without_children, includes(:children).where(:children => { :id => nil })

这里最大的区别是 joins成为 includes : 一个包含加载所有关系,如果它们存在,连接将只加载关联的对象并忽略没有关系的对象。

事实上, scope :with_children, joins(:children)应该足以返回至少有 1 个 child 的 Parent。试试看!

rails 5

See @Anson's answer below



gem activerecord_where_assoc

activerecord_where_assoc gem 可以为 Rails 4.1 到 6.0 做到这一点。
scope :without_children, where_assoc_not_exists(:children)

自引用关系被无缝处理。

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

正如@MauroDias 指出的那样, 如果是自指关系在您的 parent 和 child 之间,上面的代码不起作用。

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

考虑这个模型:
class Item < ActiveRecord::Base
has_many :children, :class_name => 'Item', :foreign_key => 'parent_id'

如何退回所有没有 child 的物品(ren):
Item.includes(:children).where(children_items: { id: nil })

我是怎么找到的 children_items table ?
Item.joins(:children)生成以下 SQL:
SELECT "items".* 
FROM "items"
INNER JOIN "items" "children_items"
ON "children_items"."parent_id" = "items"."id"

所以我猜测 Rails 在自引用情况下需要 JOIN 时使用表。

类似问题:
  • How to query a model based on attribute of another model which belongs to the first model?
  • Rails active record querying association with 'exists'
  • Rails 3, has_one / has_many with lambda condition
  • Join multiple tables with active records
  • 关于ruby-on-rails - Rails 4 范围可以找到没有 child 的 parent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082096/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com