web-dev-qa-db-fra.com

Rails - Comment utiliser Rechercher ou créer

J'ai ce qui suit:

@permission = @group.permissions.create(
  :user_id => @user.id,
  :role_id => 2,
  :creator_id => current_user.id)

Comment puis-je mettre à jour cela pour être find_or_create, de sorte que si cet enregistrement existe déjà, il est affecté à @permission, et s'il n'existe pas, l'enregistrement est créé?

17
AnApprentice

Sujet connexe:

find_or_create_by in Rails 3 et mise à jour pour créer des enregistrements

Vous pouvez étendre ActiveRecord avec votre propre update_or_create méthode (voir rubrique connexe), puis vous pouvez utiliser cette

@permission = Permission.update_or_create_by_user_id_and_role_id_and_creator_id(@user.id, 2, current_user.id) do |p|
  p.group_id = @group.id
end

Ou vous pouvez utiliser find_or_create_by... méthode:

@permission = Permission.find_or_create_by_user_id_and_role_id_and_creator_id(@user.id, 2, current_user.id)
@permission.group = @group
@permission.save
19
fl00r

Bien que la réponse acceptée est correcte , il est important de noter que dans Rails 4) cette syntaxe va changer (et la syntaxe de hachage). Vous devriez écrire ce qui suit:

@permission = Permission.where(
  user_id: @user.id, 
  role_id: 2, 
  creator_id: current_user.id).first_or_create

Ce qui ressemble en fait beaucoup plus à votre méthode originale! Voir la sous-section Finders obsolètes pour plus de détails.

51
Gavin Miller