{"id":1080,"date":"2016-09-23T16:24:16","date_gmt":"2016-09-23T14:24:16","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=1080"},"modified":"2016-09-23T16:24:16","modified_gmt":"2016-09-23T14:24:16","slug":"ruby-on-rails-utiliser-first_or_create","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/","title":{"rendered":"Ruby On Rails &#8211; utiliser first_or_create"},"content":{"rendered":"<p>Lorsque vous utilisez ActiveRecord, vous vous int\u00e9ressez forc\u00e9ment t\u00f4t ou tard \u00e0 la fonction first_or_create et en g\u00e9n\u00e9ral, vous l&rsquo;utiliser comme suit:<\/p>\n<p><code><br \/>\nMonJoliModele.first_or_create(attribut: \"unevaleur\")<br \/>\n<\/code><\/p>\n<h1>Ce qu&rsquo;on pense faire&#8230;<\/h1>\n<p>En proc\u00e9dant ainsi, vous pensez \u00ab\u00a0Soit un enregistrement avec comme valeur du champ attribut \u00ab\u00a0unevaleur\u00a0\u00bb est trouv\u00e9, soit je vais en cr\u00e9er un\u00a0\u00bb. Et bien non ! Ouvrez-vous un <em>rails console<\/em> et regardez ce qui se passe en r\u00e9alit\u00e9. Et oui, Rails prend le premier enregistrement de la table li\u00e9e au mod\u00e8le, sans m\u00eame tenir compte de la valeur du champ \u00ab\u00a0attribut\u00a0\u00bb que vous lui donnez, pensant logiquement qu&rsquo;il allait en faire quelque chose&#8230;\u00c9videmment si votre table est vide alors Rails cr\u00e9era cet enregistrement avec la valeur pass\u00e9e en param\u00e8tre, mais c&rsquo;est loin d&rsquo;\u00eatre tout le temps le cas.<\/p>\n<p><div id=\"attachment_1081\" style=\"width: 560px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf.jpeg\"><img aria-describedby=\"caption-attachment-1081\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf.jpeg\" alt=\"D\u00e9veloppeur sceptique: ne me dites pas que vous n&#039;avez jamais fait cette t\u00eate, vous mentiriez !\" width=\"550\" height=\"550\" class=\"size-full wp-image-1081\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf.jpeg 550w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf-150x150.jpeg 150w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf-300x300.jpeg 300w\" sizes=\"(max-width: 550px) 100vw, 550px\" \/><\/a><p id=\"caption-attachment-1081\" class=\"wp-caption-text\">D\u00e9veloppeur sceptique: ne me dites pas que vous n&rsquo;avez jamais fait cette t\u00eate, vous mentiriez !<\/p><\/div><br \/>\nCe que vous vouliez faire en r\u00e9alit\u00e9, c&rsquo;\u00e9tait:<br \/>\n<code><br \/>\nMonJoliModele.where(attribut: \"unevaleur\").first_or_create(attribut: \"unevaleur\")<br \/>\n<\/code><\/p>\n<p>ou, plus \u00e9l\u00e9gant :<br \/>\n<code><br \/>\ncritere = {attribut: \"unevaleur\"}<br \/>\nMonJoliModele.where(critere).first_or_create(critere)<br \/>\n<\/code><\/p>\n<p>Attention donc aux effets de bord possiblement dus \u00e0 la mauvaise utilisation de cette fonction. Notez qu&rsquo;on peut utiliser un bloc aussi. Mais attention, il n&rsquo;est ex\u00e9cut\u00e9 qu&rsquo;en cas de cr\u00e9ation d&rsquo;un nouvel enregistrement et vous l&rsquo;utiliserez \u00e9videmment si vous avez de nombreuses affectations \u00e0 y faire, et pas forc\u00e9ment deux comme dans mon exemple:<\/p>\n<p><code><br \/>\ncritere = {attribut: \"unevaleur\"}<br \/>\nMonJoliModele.where(critere).first_or_create do |modele|<br \/>\n  modele.autreattribut = \"une autre valeur\"<br \/>\n  modele.encoreunautreattribut = \"encore une autre valeur\"<br \/>\nend<\/code><\/p>\n<p>Voil\u00e0 donc pour ce <em>crash course<\/em> sur l&rsquo;utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui en m\u00eame temps nous \u00e9pargne d&rsquo;avoir \u00e0 faire un find_by suivi d&rsquo;un create, ce qui n&rsquo;est ni tr\u00e8s esth\u00e9tique, ni tr\u00e8s performant !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Lorsque vous utilisez ActiveRecord, vous vous int\u00e9ressez forc\u00e9ment t\u00f4t ou tard \u00e0 la fonction first_or_create et en g\u00e9n\u00e9ral, vous l&rsquo;utiliser comme suit: MonJoliModele.first_or_create(attribut: \u00ab\u00a0unevaleur\u00a0\u00bb) Ce qu&rsquo;on pense faire&#8230; En proc\u00e9dant ainsi, vous pensez \u00ab\u00a0Soit un enregistrement avec comme valeur du champ attribut \u00ab\u00a0unevaleur\u00a0\u00bb est trouv\u00e9, soit je vais en cr\u00e9er un\u00a0\u00bb. Et bien non ! [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[40,95,29],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog<\/title>\n<meta name=\"description\" content=\"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s&#039;av\u00e8re tr\u00e8s pratique !\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s&#039;av\u00e8re tr\u00e8s pratique !\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-09-23T14:24:16+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf.jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/\",\"url\":\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/\",\"name\":\"Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2016-09-23T14:24:16+00:00\",\"dateModified\":\"2016-09-23T14:24:16+00:00\",\"author\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"description\":\"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s'av\u00e8re tr\u00e8s pratique !\",\"breadcrumb\":{\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby On Rails &#8211; utiliser first_or_create\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"https:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog","description":"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s'av\u00e8re tr\u00e8s pratique !","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/","og_locale":"fr_FR","og_type":"article","og_title":"Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog","og_description":"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s'av\u00e8re tr\u00e8s pratique !","og_url":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2016-09-23T14:24:16+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2016\/09\/wtf.jpeg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/","url":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/","name":"Ruby On Rails - utiliser first_or_create - La Fabrique de code - Tech blog","isPartOf":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2016-09-23T14:24:16+00:00","dateModified":"2016-09-23T14:24:16+00:00","author":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"description":"De la bonne utilisation de first_or_create, fonction dont le nom assez ambigu peut \u00eatre source de confusion et qui pourtant s'av\u00e8re tr\u00e8s pratique !","breadcrumb":{"@id":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lafabriquedecode.com\/blog\/2016\/09\/ruby-on-rails-utiliser-first_or_create\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby On Rails &#8211; utiliser first_or_create"}]},{"@type":"WebSite","@id":"https:\/\/www.lafabriquedecode.com\/blog\/#website","url":"https:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1080"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=1080"}],"version-history":[{"count":3,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1080\/revisions"}],"predecessor-version":[{"id":1084,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/1080\/revisions\/1084"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=1080"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=1080"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=1080"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}