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éé?
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
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.