我有一个Location型号,可以有许多子区块,或者一个父位置. 假设位置-A是父位置,位置-B和位置-C作为子块.但是位置-B也有一个子块位置-D.

如何获取父位置-A的所有子块,包括位置-D?

我的模特:

  has_many :sub_locations, class_name: "Location", foreign_key: "parent_location_id", inverse_of: :parent_location
  belongs_to :parent_location, optional: true, class_name: "Location", foreign_key: "parent_location_id", inverse_of: :sub_locations

目前,我是这样获取它们的:

  def all_sub_location_ids
    [id] + sub_locations.map(&:all_sub_location_ids).flatten
  end

但我需要一个有效的方法.因为它投出了stack level too deep

编辑:我最终在子区块上使用了.reload,并保持现有方法不变.这样就行得通了.

推荐答案

你可以使用GEM ancestry.

请看一下官方文件here

在你的gemfile人中添加Ruby

gem 'ancestry'

创建迁移

rails g migration add_Add_ancestry_to_location ancestry:string:index

在You Location型号中,添加如下:

class Location < ApplicationRecord
  has_ancestry
end

现在您可以使用如下所示:

location_a = Location.create(name: 'Location A')
location_b = Location.create(name: 'Location B', parent: location_a)
location_c = Location.create(name: 'Location C', parent: location_a)
location_d = Location.create(name: 'Location D', parent: location_b) 

parent_location = Location.find_by(name: 'Location A')
sublocations = parent_location.descendants

这里的子块将是一个位置为Location BLocation CLocation D的array.

Ruby-on-rails相关问答推荐

是否可以使用 Turbo 帧更新 Rails 表单输入字段值?

如何在生成的 HTML 本身中显示部分名称

Rails 7.0.4 和 link_to 的数据确认不起作用

Ruby on Rails/Activerecord 排序自引用查询?

Rails 3.1 assets资源 - 奇怪的开发服务

Rails 和 jsonb 类型jsonb不存在

Rails 4.1 Mailer 预览和设计自定义邮箱

Rails:保存子对象时更新父对象

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

具有条件的列的计数器缓存?

从子类中的重载方法调用基类方法

Rails 在关联模型中排序

机械师 vs FactoryGirl - 优点和缺点

在 ruby​​ on rails 上构建方法

减go Ruby 中的日期并以分钟为单位得到差异

Ruby 根据属性在数组中查找并返回对象

如何从另一个调用 Capistrano 任务?

Rails 路由:GET 没有参数 :id

我的 JavaScript 模式/实践很糟糕.我应该go 哪里寻求帮助?

使用连接的 Ruby on Rails ActiveRecord 查询