我有以下代码:
def find_animal
animal_type = AnimalKind.find_by(conditions) ||
Animal.find_by(conditions) ||
Breed.find_by(conditions)
end
我想将它重构为:
def find_animal
animals = [AnimalKind, Animal, Breed]
animal_type = animals.first_not_nil { |m| m.find_by(conditions) }
end
有关如何实施first_not_nil
方法的想法吗?
答案 0 :(得分:7)
Enumerable#detect
将短路并返回块返回truthy值的第一个对象。但它没有返回价值的结果(正如Oleskar Verhun所指出的那样)。因此,您可以将结果存储在循环外部的变量中,如下所示:
animal = nil
[AnimalKind, Animal, Breed].detect { |klass|
animal = klass.find_by(conditions)
}
animal # will be nil or the first animal found by the supplied conditions