【问题标题】:Loop until there is parent_id循环直到有parent_id
【发布时间】:2021-08-03 09:18:02
【问题描述】:

需要帮助来缩短此代码。逻辑是直到每个位置都有一个 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

示例表字段:fields

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5


    【解决方案1】:

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

    将此添加到您的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)
    

    【讨论】:

    • 谢谢你。您的代码看起来更简单、更快。
    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多