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)
- 您可以使用(
)来获取颜色id数组,而不是使用.pluck(:id)
。这也有助于更快的查询,因为只有ID从数据库中获取,而不是从整个记录中获取.map{i|i.id.to_s}
- 我个人喜欢使用来检查另一个集合中是否存在多个值。因此,我创建了
变量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)
中,并将生成的数组从to\u散列方法中丢弃。通常最好使用不改变版本的方法,除非您明确希望产生某种效果model.attributes
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)
- 您可以使用(
)来获取颜色id数组,而不是使用.pluck(:id)
。这也有助于更快的查询,因为只有ID从数据库中获取,而不是从整个记录中获取.map{i|i.id.to_s}
- 我个人喜欢使用来检查另一个集合中是否存在多个值。因此,我创建了
变量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)
中,并将生成的数组从to\u散列方法中丢弃。通常最好使用不改变版本的方法,除非您明确希望产生某种效果model.attributes
attr\u accessor:foo
,则可以使用该属性初始化它Kls.new(foo:'bar')
根据您的行,我断言Kls
将不会在AR 5.1中检查值为'bar'
(如果foo
是一列,而不是attr\u访问器)的ivar@foo
。5@Serg