[Ruby on Rails] Wenn beim Registrieren von Daten doppelte Datensätze vorhanden sind, registrieren Sie sich nicht

Hintergrund

Nach der Bereitstellung der ursprünglichen App stelle ich fest, dass doppelte Daten registriert sind. スクリーンショット 0002-09-27 午前9.43.35.png

Als Spezifikation der App möchte ich die registrierten Datensätze nicht duplizieren.

Wenn ich die Datenbank überprüfe, Es stellt sich heraus, dass eine Registrierung möglich ist, wenn sich der zu registrierende Benutzer unterscheidet. スクリーンショット 0002-09-27 午前9.44.59.png

Die Lösung hat einige Zeit gedauert, daher werde ich sie zur Erinnerung aufzeichnen.

Problembereich

Die Bedingung für die Datenregistrierung wurde in der Steuerung festgelegt.

require 'rubygems'
require 'mechanize'

def create
    f = (params[:wiki_url])
    
    unless 
      f.start_with?("https://ja.wikipedia.org/wiki/")
      flash[:notice] = "Konnte nicht gespeichert werden, da eine ungültige URL eingegeben wurde."
      redirect_to action: 'new'
      return
    else
      agent = Mechanize.new
      page = agent.get(f) 
      page.encoding='utf-8'

Unten weggelassen...

Geben Sie in der sofern-Anweisung "https://ja.wikipedia.org/wiki/" in die eingegebenen Daten (URL) ein. Wenn nicht enthalten, wurde die Bedingung so festgelegt, dass sie nicht registriert wird.

Wenn jedoch doppelte Datensätze vorhanden sind, wurde die Bedingung, dass sie nicht registriert sind, nicht berücksichtigt Die gleichen Daten wie auf dem Bild wurden registriert.

Lösung (Schlussfolgerung)

Ich habe es wie folgt umgeschrieben und gelöst.

require 'rubygems'
require 'mechanize'

  def create
    f = (params[:wiki_url])

    if not 
      f.start_with?("https://ja.wikipedia.org/wiki/")
      flash[:notice] = "Konnte nicht registriert werden, da eine ungültige URL eingegeben wurde."
      redirect_to action: 'new'
      return
    elsif
      Company.where(page_url: "#{f}").count >= 1
      flash[:notice] = "Konnte nicht registriert werden, da die registrierte URL eingegeben wurde."
      redirect_to actiont: 'new'
      return
    else
      agent = Mechanize.new
      page = agent.get(f) 
      page.encoding = 'utf-8'

Unten weggelassen...

Der Artikel über Teratail war hilfreich und ich habe eine Lösung gefunden. : point_right: Ich möchte einen Datensatz erhalten, in dem zwei oder mehr Daten mit demselben Namen mit ActiveRecord registriert werden.

Es gibt zwei wesentliche Änderungen.

-Änderte von es sei denn Anweisung zu wenn nicht Anweisung

Wechseln Sie von der if-Anweisung zu der if not-Anweisung

Es gibt kein Elsif im Rubin, außer Aussage. .. .. Korrekt.

Ich möchte zusätzlich zur ungültigen Bedingung zur Verhinderung der Dateneingabe eine Bedingung zur Verhinderung von Duplikaten hinzufügen. Da elsif jedoch nur in Anweisungen verwendet werden kann, Elsif anstelle von if not-Anweisung hinzugefügt.

** Wo Methode hinzugefügt ** (Hier ist der Punkt!)

Der Ablauf der Bedingungen (Verarbeitung) ist wie folgt.

Ermitteln Sie die Anzahl der Datensätze, die den Bedingungen in der Tabelle mit der where-Methode entsprechen

Sie können Datensätze abrufen, die die Bedingungen mit .where ("Bedingung") erfüllen.

Modellname.where("Bedingungen")

. Dieses Mal erhalten wir die Spalte page_url des Unternehmensmodells.

Company.where(page_url)

. Außerdem möchte ich nach Daten suchen, die mit den in der Spalte page_url eingegebenen Daten übereinstimmen. Fügen Sie wie folgt hinzu.

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

.

{f} repräsentiert die Zeichenfolge in der Variablen.

Die Variable f wird an der folgenden Stelle definiert, und der Inhalt ist wie folgt.

require 'rubygems'
require 'mechanize'

  def create
    f = (params[:wiki_url]) <=Das ist hier.

Unten weggelassen...

image.png

. Feststellen, wie viele als Ergebnis der Suche in der Spalte page_url gefunden wurden Fügen Sie eine Zählmethode hinzu.

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

Beurteilen Sie 1 oder mehr (ob Daten vorhanden sind), indem Sie die Anzahl der erfassten Daten auf die Bedingung anwenden

Überprüfen Sie, ob 1 oder mehr vorhanden sind, dh zählen Sie die Anzahl der URLs, die mit den eingegebenen Daten übereinstimmen.

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

Wenn es 1 oder mehr ist (es gibt Daten), werden diese nicht akzeptiert

image.png

Bonus

Es spiegelt sich in der App wider, also spielen Sie bitte damit. Unsung:hero image.png

Recommended Posts

[Ruby on Rails] Wenn beim Registrieren von Daten doppelte Datensätze vorhanden sind, registrieren Sie sich nicht
Ruby on Rails-Datensatzsuche, erstellen Sie die Methode find_or_create_by, wenn nicht
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Was tun, wenn blockierter Host: "Hostname" in Ruby on Rails angezeigt wird
Was tun, wenn die Bereitstellung in Heroku fehlschlägt (Ruby-App nicht erkannt)?
[Ruby on Rails] Einführung der Anfangsdaten
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
Kehren Sie nicht zurück, wenn Sie Notizen in Ruby machen
Wenn das Ruby on Rails-Terminal zurückrollt
(Ruby on Rails6) Erstellen von Daten in einer Tabelle
[Ruby on Rails] Implementierung einer Validierung, die nur funktioniert, wenn die Bedingungen erfüllt sind
[Ruby on Rails] Wenn der Befehl heroku ausgeführt wird, wird der Befehl bash: heroku: nicht gefunden angezeigt. [Rails Tutorial]
Hash in Ruby läuft über Stapel, wenn es viele Argumente gibt
Ruby on Rails-Lernprogramm Problematische Hinweise unter Windows