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 " ...
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
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.
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