当find涉及单个属性而create涉及多个属性时,实现find_or_create_by

TDB*_*TDB 5 activerecord ruby-on-rails

在我的 Rails 应用程序中,我想通过电子邮件查找用户,或者如果该用户不存在,则使用该电子邮件以及一些其他属性创建一个用户。有没有比下面的代码更简单的方法来做到这一点,也许使用find_or_create_by

def set_user
  if self.user = User.find_by(email: recipient)
  else
    self.user = User.create(email: recipient,
                        password: Devise.friendly_token.first(6),
                        confirmed_at: DateTime.now)
  end
end
Run Code Online (Sandbox Code Playgroud)

小智 5

find_or_create_by采用一个仅在创建时应用的块。它将根据您提供的属性查找记录,如果未找到,则会使用您指定的块属性创建一个记录。

在你的情况下,这看起来像:

user = User.find_or_create_by(email: recipient) do |user|
  user.password = Devise.friendly_token.first(6),
  user.confirmed_at = DateTime.now
end
Run Code Online (Sandbox Code Playgroud)