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

时间:2017-09-16 05:55:17

标签: ruby-on-rails activerecord

在我的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

3 个答案:

答案 0 :(得分:1)

find_or_create_by采用仅在create上应用的块。它将通过您提供的属性查找记录,如果找不到,将使用您指定的块属性创建一个。

在您的情况下,这将是:

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

答案 1 :(得分:0)

def set_user
  user = User.find_or_initialize_by(email: recipient)
  user.update( password: Devise.friendly_token.first(6),
               confirmed_at: DateTime.now) if user.new_record?
  user
end

答案 2 :(得分:0)

始终找到用户,询问您的搜索是否存在或者查找方法返回为nil,如果返回nil则创建用户

def set_user
user = User.find_by(email: recipient)
unless user
 user = User.create(email: recipient,
                    password: Devise.friendly_token.first(6),
                    confirmed_at: DateTime.now)
end