循环直到有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)
需要帮助缩短这个 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)