2017-09-16 1 views
0

Dans mon application Rails, je souhaite trouver un utilisateur par courrier électronique ou, si l'utilisateur n'existe pas, en créer un avec cet e-mail ainsi que quelques autres attributs. Y at-il un moyen moins maladroit que le code ci-dessous pour le faire, peut-être en utilisant find_or_create_by?Implémentation find_or_create_by lorsque find implique un attribut unique mais create implique plusieurs attributs

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 

Répondre

1

find_or_create_by prend un bloc qui sera appliqué seulement sur créer. Il cherchera un enregistrement par l'attribut que vous fournissez et si aucun n'est trouvé, il en créera un avec les attributs de bloc que vous spécifiez.

Dans votre cas, cela ressemblerait à ceci:

user = User.find_or_create_by(email: recipient) do |user| 
    user.password: Devise.friendly_token.first(6), 
    user.confirmed_at: DateTime.now 
end 
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 
0

toujours trouver l'utilisateur, demandez si votre recherche existe ou la méthode de recherche est revenu nul, si elle est revenu nul créer un utilisateur

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