执行find_or_create_by时发现涉及单个属性,但创建涉及多个属性

问题描述:

在我的Rails应用程序我想通过他们的电子邮件找到一个用户,或者如果用户不存在,创建一个与该电子邮件以及一些其他属性。有没有比下面的代码更笨拙的方式来做到这一点,也许使用find_or_create_by执行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 

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 

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 

总能找到用户,询问你的搜索存在或find方法返回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