返回与相同函数分离的第一个truthy值

coo*_*sse 2 ruby

我有以下代码:

def find_animal
  animal_type = AnimalKind.find_by(conditions) ||
                Animal.find_by(conditions) ||
                Breed.find_by(conditions)
end
Run Code Online (Sandbox Code Playgroud)

我想将它重构为:

def find_animal
  animals = [AnimalKind, Animal, Breed]
  animal_type = animals.first_not_nil { |m| m.find_by(conditions) } 
end
Run Code Online (Sandbox Code Playgroud)

关于如何实现first_not_nil方法的任何想法?

pdo*_*obb 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
Run Code Online (Sandbox Code Playgroud)

  • 这将找到类,但问题中的问题是找到特定模型类的记录,这意味着你还需要在最后添加`find_by(conditions)`. (2认同)