我有以下代码:
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
方法的任何想法?
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