我有一个很大的成分数据库。我使用自定义类创建成分及其命名变体。油籽就是其中一类。
以下油料种子有64种命名方式:
@oil_seed = OilSeed.new(
common_name: "canola",
genus: "brassica",
species: ["capestris", "napus", "rapa", "rapa oleifera", "napus oleifera", "capestris oleifera"],
oil_types: ["oil"],
oil_derivatives: ["seed"],
other_names: ["rapeseed", "polish canola", "rape"],
)
该类包含用于创建命名变体的不同方法。几乎所有方法都有一些嵌套的.each
调用级别。以下是最复杂的。 (请注意,create_name
只是对实际上在数据库中创建成分的东西的方法调用。)
def full_names(alt_names)
alt_names.each do |alt_name|
@oil_types.each do |oil_type|
create_name("#{oil_type} of #{alt_name}")
create_name("#{alt_name} #{oil_type}")
@oil_derivatives.each do |oil_derivative|
create_name("#{alt_name} #{oil_derivative} #{oil_type}")
end
end
@scientific_names.each do |sn|
@oil_types.each do |oil_type|
create_name("#{scientific_names} (#{alt_name}) #{oil_type}")
@oil_derivatives.each do |oil_derivative|
create_name("#{scientific_names} (#{alt_name}) #{oil_derivative} #{oil_type}")
end
end
end
end
end
此方法为种子common_name
和每个other_names
attrs生成以下名称变体。
我的代码工作正常,但是我想建议我是否(或者如果可以)重构复杂的命名方法。首先,因为很难说出到底发生了什么。其次,麻烦的是向OilSeed
类添加新属性。每次我需要添加一个电话时,都会创建大量新的each
通话,而这些通话很难维护。
编辑:重构
def full_names(alt_names)
combinations = generate_combinations(alt_names, @oil_types, @oil_derivatives)
names = []
combinations.each do |sn, ot, od|
names << "#{sn} #{ot}"
names << "#{sn} #{od} #{ot}"
end
create_names(names)
end
def generate_combinations(bases, *components)
bases.flatten.product(*components)
end
def create_names(names)
names.uniq.each { |x| create_name(x) }
end