Ruby中如何实现两个数组所有元素组合的穷尽比较?
解决Rails中两个数组全元素组合比较的问题
原代码的问题
你当前的代码里用map遍历all_water_bottles是错误的——map的作用是转换数组并返回新数组,不是单纯遍历。这可能导致部分遍历逻辑没有执行到位,出现遗漏元素的情况。另外嵌套循环的写法效率较低,逻辑也可以更简洁。
方案1:高效批量检查(推荐)
先把现有用户的水瓶名称提取成查找效率更高的集合,再批量检查提交参数里的名称是否重复,避免嵌套循环:
# 处理参数,提取非空的水瓶名称 submitted_names = water_bottle_params.values.reject(&:blank?).map { |wb| wb['name'] }.compact # 提取现有用户的所有水瓶名称到Set(查找速度远快于数组) existing_names = current_user.water_bottles.pluck(:name).to_set # 检查重复 submitted_names.each do |name| raise "Water Bottle Exist!" if existing_names.include?(name) end
方案2:修复嵌套循环的写法
如果一定要用嵌套循环的方式,把map改成each(单纯遍历场景用each),确保所有元素组合都被比较:
formatted_water_bottles = water_bottle_params.values.reject(&:blank?) all_water_bottles = current_user.water_bottles formatted_water_bottles.each do |w| all_water_bottles.each do |wb| # 这里把map替换为each raise "Water Bottle Exist!" if wb.name == w['name'] end end
额外建议
这种重复校验逻辑其实可以放到Rails模型的验证里,更符合框架约定:
class WaterBottle < ApplicationRecord belongs_to :user validates :name, uniqueness: { scope: :user_id, message: "Water Bottle Exist!" } end
这样在创建或更新水瓶时会自动触发校验,无需手动写遍历逻辑。
内容的提问来源于stack exchange,提问作者valcod3r
相关产品推荐
相关产品推荐

