Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 优化';否则';钢轨状况_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 优化';否则';钢轨状况

Ruby on rails 优化';否则';钢轨状况,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在制作一个应用程序,其部分代码需要许多if。。其他条件: if @model_name == "Style" if row.include? ('colors') colors = row['colors'].split(';') model.style_colors.concat Color.where('code IN (?)', colors).map {|i| i.id.to_s } row.delet

我正在制作一个应用程序,其部分代码需要许多
if。。其他
条件:

   if @model_name == "Style"
        if row.include? ('colors')
          colors = row['colors'].split(';')
          model.style_colors.concat Color.where('code IN (?)', colors).map {|i| i.id.to_s }
          row.delete('colors')
        end

        if row.include? ('gender') and row.include? ('garments')
          @garments = row['garments']
          @gender = row['gender']


          row.delete('garments')
          row.delete('gender')
        end

        if row.include? ('sports')
          @sports = row['sports']

          row.delete('sports')
        end

        if row.include?('decoration_packages')
          @decorations_packages = row['decoration_packages']

          row.delete('decoration_packages')
        end

        model.attributes = row.to_hash.merge!(active: FALSE)
      else
        model.attributes = row.to_hash
      end
我需要创建
散列的对象来访问子类,然后将它们从
中删除,以便将其保存到模型中


你知道我该如何最小化条件的使用或优化它吗?

这里有一些优化

row.include? ('gender') and row.include? ('garments')
可以作为

['gender', 'garments'].all?{|x| row.include?(x)}
@garments = row.delete('garments')

可以作为

['gender', 'garments'].all?{|x| row.include?(x)}
@garments = row.delete('garments')

实际上,你可以将很多这样的东西挤到一行上:

if row.include? ('sports')
  @sports = row['sports']
  row.delete('sports')
end
可能是

@sports = row.delete('sports') if row.include? ('sports')

还值得考虑的是:

  • 是否需要从“行”中删除值?你能取回这个值吗
  • 你想在这里干什么?看起来您正在将哈希值拉入实例变量。。。这就是ActiveRecord的基本功能。你能用这些属性创建一个模型,然后用这种风格调用它吗

    Style.new(row) 
    

    • 这里有一些优化

      row.include? ('gender') and row.include? ('garments')
      
      可以作为

      ['gender', 'garments'].all?{|x| row.include?(x)}
      
      @garments = row.delete('garments')
      

      可以作为

      ['gender', 'garments'].all?{|x| row.include?(x)}
      
      @garments = row.delete('garments')
      

      实际上,你可以将很多这样的东西挤到一行上:

      if row.include? ('sports')
        @sports = row['sports']
        row.delete('sports')
      end
      
      可能是

      @sports = row.delete('sports') if row.include? ('sports')
      

      还值得考虑的是:

      • 是否需要从“行”中删除值?你能取回这个值吗
      • 你想在这里干什么?看起来您正在将哈希值拉入实例变量。。。这就是ActiveRecord的基本功能。你能用这些属性创建一个模型,然后用这种风格调用它吗

        Style.new(row) 
        

      我会用您当前的代码执行以下操作:

      if @model_name == "Style"
        row_key_set = row.keys.to_set
      
        if row.include? 'colors'
          colors = row['colors'].split(';')
          color_ids = Color.where(code: colors).pluck(:id)
          model.style_colors.concat(color_ids.map(&:to_s))
        end
      
        if row_key_set >= Set['gender', 'garments']
          @garments = row.delete('garments')
          @gender = row.delete('gender')
        end
      
        @sports = row.delete('sports')
        @decorations_packages = row.delete('decoration_packages')
      
        model.attributes = row.to_hash.merge(active: false)
      else
        model.attributes = row.to_hash
      end
      
      • 不要使用
        Color.where('code-IN(?),colors)
        您可以只使用
        Color.where(code:colors)

      • 您可以使用(
        .pluck(:id)
        )来获取颜色id数组,而不是使用
        .map{i|i.id.to_s}
        。这也有助于更快的查询,因为只有ID从数据库中获取,而不是从整个记录中获取

      • 我个人喜欢使用来检查另一个集合中是否存在多个值。因此,我创建了
        row\u key\u set
        变量
        row.keys.to\u set
        。现在,只需检查密钥集是否大于或等于另一个密钥集(因此是超集),就可以轻松地检查哈希表中是否存在某些密钥
        row\u key\u set>=set['gender','contactures']
        只需一次检查,您就可以省去这一点,但如果您有多个检查,这可能值得麻烦。我还发现用这种方式编写的代码更具可读性,但这只是个人参考

      • 您不需要检查散列中是否存在密钥,它告诉我们:

        删除键-值对并从其键等于键的hsh返回值。如果找不到密钥,则返回nil

        这意味着您可以省略include?检查delete并将结果直接写入实例变量。如果键不存在,将为实例变量设置
        nil

      • 最后,我将在
        row.to_hash.merge中省略解释标记!(活动:false)
        。没有解释标记的版本不会改变原始阵列,并减少意外副作用的机会。您正在将变量保存到
        model.attributes
        中,并将生成的数组从to\u散列方法中丢弃。通常最好使用不改变版本的方法,除非您明确希望产生某种效果


      我会用您当前的代码执行以下操作:

      if @model_name == "Style"
        row_key_set = row.keys.to_set
      
        if row.include? 'colors'
          colors = row['colors'].split(';')
          color_ids = Color.where(code: colors).pluck(:id)
          model.style_colors.concat(color_ids.map(&:to_s))
        end
      
        if row_key_set >= Set['gender', 'garments']
          @garments = row.delete('garments')
          @gender = row.delete('gender')
        end
      
        @sports = row.delete('sports')
        @decorations_packages = row.delete('decoration_packages')
      
        model.attributes = row.to_hash.merge(active: false)
      else
        model.attributes = row.to_hash
      end
      
      • 不要使用
        Color.where('code-IN(?),colors)
        您可以只使用
        Color.where(code:colors)

      • 您可以使用(
        .pluck(:id)
        )来获取颜色id数组,而不是使用
        .map{i|i.id.to_s}
        。这也有助于更快的查询,因为只有ID从数据库中获取,而不是从整个记录中获取

      • 我个人喜欢使用来检查另一个集合中是否存在多个值。因此,我创建了
        row\u key\u set
        变量
        row.keys.to\u set
        。现在,只需检查密钥集是否大于或等于另一个密钥集(因此是超集),就可以轻松地检查哈希表中是否存在某些密钥
        row\u key\u set>=set['gender','contactures']
        只需一次检查,您就可以省去这一点,但如果您有多个检查,这可能值得麻烦。我还发现用这种方式编写的代码更具可读性,但这只是个人参考

      • 您不需要检查散列中是否存在密钥,它告诉我们:

        删除键-值对并从其键等于键的hsh返回值。如果找不到密钥,则返回nil

        这意味着您可以省略include?检查delete并将结果直接写入实例变量。如果键不存在,将为实例变量设置
        nil

      • 最后,我将在
        row.to_hash.merge中省略解释标记!(活动:false)
        。没有解释标记的版本不会改变原始阵列,并减少意外副作用的机会。您正在将变量保存到
        model.attributes
        中,并将生成的数组从to\u散列方法中丢弃。通常最好使用不改变版本的方法,除非您明确希望产生某种效果


      ActiveRecord不会将属性放入实例变量中。@SergioTulentsev是的,它会。特别是当这些实例变量表示相关表中的列时。但是,如果向AR类添加
      attr\u accessor:foo
      ,则可以使用该属性初始化它
      Kls.new(foo:'bar')
      根据您的行,我断言
      Kls
      将不会在AR 5.1中检查值为
      'bar'
      (如果
      foo
      是一列,而不是attr\u访问器)的ivar
      @foo
      。5@Serg