Ruby 使用相同的函数在析取中返回第一个truthy值
我有以下代码:Ruby 使用相同的函数在析取中返回第一个truthy值,ruby,Ruby,我有以下代码: 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
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\u not\nil
方法的任何想法?将短路并返回块返回真实值的第一个对象。但它不会返回值的结果(正如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
这方面很难改进。我只建议做一个很小的风格改变,那就是使用
find
而不是detect
,因为我认为find\u by
读起来更好。这会找到类,但问题是要找到特定模型类的记录,所以这意味着您还需要添加find\u by(条件)
最后,谢谢@OleksandrVerhun。修正了答案。如何在数组上生成单线函数?问题的第一个\u或\u nil