Dans les Rails, ce qui est la meilleure façon de mettre à jour un enregistrement ou d'en créer une nouvelle si elle n'existe pas?

J'ai une instruction de création de certains modèles, mais c'est la création d'un enregistrement dans une table de jointure, indépendamment de savoir si l'enregistrement existe déjà.

Voici ce que mon code ressemble à ceci:

@user = User.find(current_user)
@event = Event.find(params[:id])
for interest in @event.interests
 @user.choices.create(:interest => interest, :score => 4)
end

Le problème est qu'il crée des enregistrements n'importe quoi. Je tiens à créer un enregistrement uniquement si aucun enregistrement n'existe déjà; si un enregistrement n'existe pas, j'aimerais qu'il prenne l'attribut de l'enregistrement trouvé et d'ajouter ou de soustraire 1.

J'ai été en regardant autour ont vu quelque chose qui s'appelle find_or_create_by. Qu'est-ce quand il trouve un record? Je tiens à prendre le courant :score attribut et ajouter 1.

Est-il possible de trouver ou de créer par id? Je ne suis pas sûr de ce que l'attribut je voudrais trouver en, car le modèle que je suis à la recherche d'une jointure modèle qui n'a id clés étrangères et le score d'attribut.

J'ai essayé

@user.choices.find_or_create_by_user(:user => @user.id, :interest => interest, :score => 4)

mais il a obtenu

méthode non find_by_user

Que dois-je faire?

  • Est current_user déjà une instance de l'Utilisateur modèle? Si oui, vous n'avez pas besoin de re-trouver et pouvez simplement utiliser current_user au lieu de @user = ....