web-dev-qa-db-fra.com

Rails first_or_create méthode ActiveRecord

Que fait le first_or_create/first_or_create! méthode faire dans Rails?

Selon le documentation , la méthode " n'a pas de description " ...

26
Marco Prins

Des Guides

first_or_create

Le first_or_create la méthode vérifie si first renvoie nil ou non. S'il retourne nil, create est appelé. Ceci est très puissant lorsqu'il est couplé à la méthode where. Voyons un exemple.

Supposons que vous souhaitiez trouver un client nommé "Andy", et s’il n’y en a pas, créez-en un et définissez également son attribut verrouillé sur false. Vous pouvez le faire en exécutant:

Client.where(:first_name => 'Andy').first_or_create(:locked => false)
# => #<Client id: 1, first_name: "Andy", orders_count: 0, locked: false, created_at: "2011-08-30 06:09:27", updated_at: "2011-08-30 06:09:27">

Le SQL généré par cette méthode ressemble à ceci:

SELECT * FROM clients WHERE (clients.first_name = 'Andy') LIMIT 1
BEGIN
INSERT INTO clients (created_at, first_name, locked, orders_count, updated_at) VALUES ('2011-08-30 05:22:57', 'Andy', 0, NULL, '2011-08-30 05:22:57')
COMMIT

first_or_create renvoie soit l'enregistrement qui existe déjà, soit le nouvel enregistrement. Dans notre cas, nous n'avions pas encore de client nommé Andy, donc l'enregistrement est créé et renvoyé.

first_or_create!

Vous pouvez aussi utiliser first_or_create! pour lever une exception si le nouvel enregistrement n'est pas valide. Les validations ne sont pas traitées dans ce guide, mais supposons un instant que vous ajoutiez temporairement

validates :orders_count, :presence => true

à votre modèle client. Si vous essayez de créer un nouveau client sans passer un nombre de commandes, l'enregistrement sera invalide et une exception sera déclenchée:

Client.where(:first_name => 'Andy').first_or_create!(:locked => false)
# => ActiveRecord::RecordInvalid: Validation failed: Orders count can't be blank
54
Pavan

Si vous vérifiez la source, vous verrez qu'ils sont presque identiques. La seule différence est que la première appelle la méthode "create" et l'autre "create!". Cela signifie que le second déclenchera une exception si la création échoue.

1
dobrinov

Obtient le premier enregistrement qui correspond à ce que vous avez spécifié ou en crée un s'il n'y a pas de correspondance

0
j-dexx