Ruby 中对 Tenerary 的简单 if 语句

Simply if statement to a Tenerary in Ruby

我是 Rails 的新手,想知道以下问题:

有没有办法进一步简化这个?

  animal = Animal.find_by(name:name, type:type)
  if !animal
    animal = Animal.create(name:name, type:type)

我正在考虑使用三元表达式,但我想知道如何在不重复代码的情况下编写它,或者这是否是正确的做法。

animal = Animal.find_by(name:name, type:type) ? Animal.find_by(name:name, type:type) :  Animal.create(name:name, type:type);

尝试find_or_create_by

animal = Animal.find_or_create_by(name: name, type: type)

在您的特定情况下, 是更好的答案。但是,我想提供一个干净的解决方案来解决您目前拥有的问题。

Ruby 允许内联 modifier-if/unless 语句。这看起来像这样:

animal = Animal.find_by(name: name, type: type)
animal = Animal.create(name: name, type: type) unless animal

您也可以在这里使用 ||= 运算符(这是我的偏好)。如果变量当前持有假值(nilfalse),此运算符仅将正确的值分配给变量。

animal = Animal.find_by(name: name, type: type)
animal ||= Animal.create(name: name, type: type)

# or if you prefer the longer one-liner
animal = Animal.find_by(name: name, type: type) || Animal.create(name: name, type: type)

还有一个变体:

animal = Animal.find_by(name:name, type:type) || Animal.create(name:name, type:type)