循环直到有parent_id

Loop until there is parent_id

需要帮助缩短这个 code.logic 直到每个位置都有一个 parent_id 将 id 推送到 _location_ids

这是我的代码

     location_ids = location_id.map{|a| a.location_id}.uniq.sort #if location_id
     second_level_parent_ids = []

     location_ids.each do |loc|
         _location = Location.select(:parent_id).find(loc)
         if !_location.parent_id.nil?
             second_level_parent_ids.push(_location.parent_id)
         end
     end

     second_level_parent_ids = second_level_parent_ids.uniq.sort

     third_level_parent_ids = []
     second_level_parent_ids.each do |second_id|
         _location = Location.select(:parent_id).find(second_id)
         if !_location.parent_id.nil?
             third_level_parent_ids.push(_location.parent_id)
         end
     end

    _location_ids = location_ids + second_level_parent_ids + third_level_parent_ids

样本 table 字段:fields

谢谢。

我会尝试在数据库中完成繁重的工作,而不是将记录加载到内存中。

将此添加到您的 Location 模型 app/models/location.rb

scope :with_parent_by_id, ->(ids) { where(id: ids).where.not(parent_id: nil) }
scope :distinct_by_parent, -> { order(:parent_id).distinct }

def self.uniq_present_parent_ids_for(ids)
  with_parent_by_id(idsids).distinct_by_parent.pluck(:parent_id)
end

并在您问题中的示例位置像这样使用它

location_ids = location_id.map(&:location_id).sort
second_level_parent_ids = Location.uniq_present_parent_ids_for(location_ids)
third_level_parent_ids = Location.uniq_present_parent_ids_for(second_level_parent_ids)

_location_ids = (location_ids + second_level_parent_ids + third_level_parent_ids)