[Ruby on Rails] S'il y a des enregistrements en double lors de l'enregistrement des données, ne vous enregistrez pas

Contexte

Après avoir déployé l'application d'origine, je remarque que des données en double sont enregistrées. スクリーンショット 0002-09-27 午前9.43.35.png

En tant que spécification de l'application, je ne souhaite pas dupliquer les enregistrements enregistrés.

Quand je vérifie la base de données, Il s'avère que si l'utilisateur à enregistrer est différent, il sera possible de s'inscrire. スクリーンショット 0002-09-27 午前9.44.59.png

Cela a pris un certain temps à résoudre, je vais donc l'enregistrer comme un rappel.

Zone problématique

La condition d'enregistrement des données a été définie dans le contrôleur.

require 'rubygems'
require 'mechanize'

def create
    f = (params[:wiki_url])
    
    unless 
      f.start_with?("https://ja.wikipedia.org/wiki/")
      flash[:notice] = "Impossible d'enregistrer car une URL non valide a été saisie."
      redirect_to action: 'new'
      return
    else
      agent = Mechanize.new
      page = agent.get(f) 
      page.encoding='utf-8'

Omis ci-dessous...

Dans l'instruction sauf, entrez "https://ja.wikipedia.org/wiki/" dans les données saisies (URL). Si n'est pas inclus, la condition a été définie de sorte qu'elle ne soit pas enregistrée.

Cependant, s'il y a des enregistrements en double, la condition selon laquelle ils ne sont pas enregistrés n'a pas été incluse. Les mêmes données que celles indiquées sur l'image ont été enregistrées.

Solution (conclusion)

Je l'ai réécrit comme suit et je l'ai résolu.

require 'rubygems'
require 'mechanize'

  def create
    f = (params[:wiki_url])

    if not 
      f.start_with?("https://ja.wikipedia.org/wiki/")
      flash[:notice] = "Impossible de s'inscrire car une URL non valide a été saisie."
      redirect_to action: 'new'
      return
    elsif
      Company.where(page_url: "#{f}").count >= 1
      flash[:notice] = "Impossible de s'inscrire car l'URL enregistrée a été saisie."
      redirect_to actiont: 'new'
      return
    else
      agent = Mechanize.new
      page = agent.get(f) 
      page.encoding = 'utf-8'

Omis ci-dessous...

L'article sur teratail a été utile et j'ai trouvé une solution. : point_right: Je veux obtenir un enregistrement dans lequel deux ou plusieurs données avec le même nom sont enregistrées en utilisant ActiveRecord.

Il y a deux changements majeurs.

-Changé de la déclaration sauf à la déclaration sinon

Passer de la déclaration sauf à la déclaration sinon

Il n'y a pas d'elsif dans le ruby, sauf instruction. .. .. C'est vrai.

Je souhaite ajouter une condition de prévention de duplication en plus de la condition de prévention d'entrée de données non valide. Cependant, comme elsif ne peut pas être utilisé dans les instructions sauf, Ajout de elsif au lieu de if not statement.

** Où méthode ajoutée ** (Voici le point!)

Le flux des conditions (traitement) est le suivant.

Obtenez le nombre d'enregistrements qui correspondent aux conditions de la table avec la méthode where

Vous pouvez obtenir des enregistrements qui remplissent les conditions avec .where ("condition").

Nom du modèle.where("conditions")

. Cette fois, nous obtiendrons la colonne page_url du modèle Company.

Company.where(page_url)

. De plus, je souhaite rechercher des données qui correspondent aux données saisies dans la colonne page_url. Ajoutez comme suit.

Company.where(page_url: "#{f}")

.

{f} représente la chaîne dans la variable.

La variable f est définie à l'emplacement suivant, et le contenu est comme ceci.

require 'rubygems'
require 'mechanize'

  def create
    f = (params[:wiki_url]) <=C'est ici.

Omis ci-dessous...

image.png

. Pour déterminer combien ont été trouvés suite à une recherche dans la colonne page_url Ajoutez une méthode de comptage.

Company.where(page_url: "#{f}").count

Juger 1 ou plus (s'il y a des données) en appliquant le nombre de données acquises à la condition

Vérifiez s'il y en a 1 ou plus, c'est-à-dire comptez le nombre d'URL qui sont identiques aux données saisies.

Company.where(page_url: "#{f}").count >= 1

Si c'est 1 ou plus (il y a des données), cela ne sera pas accepté

image.png

prime

Cela se reflète dans l'application, alors jouez avec. Unsung:hero image.png

Recommended Posts

[Ruby on Rails] S'il y a des enregistrements en double lors de l'enregistrement des données, ne vous enregistrez pas
Recherche d'enregistrements Ruby on Rails, création sinon méthode find_or_create_by
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Que faire lorsque l'hôte bloqué: "nom d'hôte" apparaît dans Ruby on Rails
Que faire si le déploiement échoue dans Heroku (application Ruby non détectée)
[Ruby on Rails] Introduction des données initiales
[Ruby on Rails] Fonction de recherche (non sélectionnée)
Ne pas revenir lors de la prise de notes en Ruby
Quand le terminal Ruby on Rails revient en arrière
(Ruby on Rails6) Création de données dans une table
[Ruby on Rails] Implémentation de la validation qui ne fonctionne que lorsque les conditions sont remplies
[Ruby on rails] Lors de l'exécution de la commande heroku, bash: heroku: command not found s'affiche. [Tutoriel Rails]
Ruby Hash déborde de pile lorsqu'il y a de nombreux arguments
Tutoriel Ruby on Rails Remarques gênantes lors de l'exécution sous Windows