[RUBY] So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle

Einführung

Wie bei Twitter kann ein Benutzer mehrere Tweets mögen, und ein Tweet mag mehrere Benutzer Ich denke, wir implementieren oft viele-zu-viele-Beziehungen wie! Die Kombination muss eindeutig sein, da einige Benutzer nur einen Tweet pro Tweet mögen. Dieses Mal werde ich erklären, wie die Kombination von Daten in der Zwischentabelle eindeutig gemacht wird.

Entwicklungsumgebung

Rails 6.0.3 Ruby 2.7.1 Test: Rspec, FactoryBot, Shoulda-Matcher

1. Tabelle

Die folgenden drei Tabellen werden dieses Mal verwendet.

Benutzertabelle

id name email
1 Benutzer 1 [email protected]
2 Benutzer 2 [email protected]

Tweet Tabelle

id content
1 tweet1
2 tweet2

Wie Tabelle (Zwischentabelle)

id user_id tweet_id
1 1 2
2 1 3

Viele-zu-viele-Beziehung

Ich werde diesmal die Erklärung von vielen zu vielen weglassen.

user.rb


class User < ApplicationRecord
  has_many :likes, dependent: :destroy
end

tweet.rb


class Tweet < ApplicationRecord
  has_many_to :likes
end

like.rb


class Like < ApplicationRecord
  belongs_to :user
  belongs_to :tweet
end

2. Wie man eine Kombination einzigartig macht

Und diesmal ist es die Hauptimplementierung. Es gibt zwei Dinge zu tun.

  1. Fügen Sie der Migrationsdatei mit add_index (Einschränkung DB) eine eindeutige Einschränkung hinzu.
  2. Fügen Sie dem Modell der Zwischentabelle eine Validierung hinzu (fügen Sie eine Validierung auf der Anwendungsseite hinzu).

2.1 Fügen Sie der Migrationsdatei mit add_index eine eindeutige Einschränkung hinzu

Fügen Sie der Migrationsdatei der Zwischentabelle add_index: liks, [: user_id ,: tweet_id], unique: true hinzu. Vergessen Sie nicht, nach dem Hinzufügen zu migrieren!

class CreateLikes < ActiveRecord::Migration[6.0]
  def change
    create_table :likes do |t|
      t.references :user, null: false, foreign_key: true
      t.references :tweet, null: false, foreign_key: true

      t.timestamps
    end
    add_index :likes, [:user_id, :tweet_id], unique: true   #Hier hinzufügen
  end
end

2.2 Validierung zum Modell der Zwischentabelle hinzufügen

Fügen Sie dem Zwischentabellenmodell validates: hotel_id, Uniqueness: {scope :: staff_id} hinzu.

like.rb


class Like < ApplicationRecord
  belongs_to :user
  belongs_to :tweet

  validates :user_id, uniqueness: { scope: :tweet_id }  #Hier hinzufügen
end

Das ist alles, was erforderlich ist. Stellen Sie sicher, dass Sie dieselbe Kombination nur einmal in der Konsole registrieren können.

3. Rspec-Test zur Sicherstellung der Eindeutigkeit

Als Referenz werden wir auch den Test vorstellen. Es wird davon ausgegangen, dass Rspec, FactoryBot und Shoulda-Matcher festgelegt wurden.

like_spec.rb


require 'rails_helper'

RSpec.describe Like, type: :model do
  let(:user) { create(:user) }
  let(:tweet) { create(:tweet) }
  before { create(:like, user: user, tweet: tweet) }

  it { should belong_to(:user) }  #Überprüfen Sie die Viele-zu-Viele-Beziehung zwischen dieser und der folgenden Zeile
  it { should belong_to(:tweet) }
  it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:tweet_id) } #Stellen Sie sicher, dass es hier einzigartig ist
end

abschließend

Haben Sie die Kombination einzigartig gemacht? Ich denke, dass Implementierungen wie diese häufig verwendet werden, daher hoffe ich, dass Sie sie hilfreich finden.

Recommended Posts

So erstellen Sie eine eindeutige Datenkombination in der Schienen-Zwischentabelle
So löschen Sie alle Daten in einer bestimmten Tabelle
[Rails] So ändern Sie den Spaltennamen der Tabelle
So löschen Sie große Datenmengen in Rails und Bedenken
So ändern Sie die maximale und maximale Anzahl von POST-Daten in Spark
So ändern Sie den Wert einer Variablen an einem Haltepunkt in IntelliJ
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
[Schienen] So erstellen Sie eine Tabelle, fügen eine Spalte hinzu und ändern den Spaltentyp
So machen Sie https zum Schema der URL, die vom URL-Helfer von Rails generiert wurde
[Bestellmethode] Legen Sie die Reihenfolge der Daten in Rails fest
Machen Sie einen Rand links vom TextField
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
Verwendung von JQuery in Rails 6 js.erb
(Ruby on Rails6) Erstellen von Daten in einer Tabelle
So überprüfen Sie Rails-Befehle im Terminal
[Ruby on Rails] So machen Sie das Linkziel zu einem Teil der angegebenen ID
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
So stellen Sie die Anzeigezeit in Rails auf japanische Zeit ein
So implementieren Sie eine nette Funktion in Ajax mit Rails
So erstellen Sie einen Daten-URI (base64) in Java
[Ruby / Rails] Legen Sie einen eindeutigen (eindeutigen) Wert in der Klasse fest
[So fügen Sie ein Video mit Rails in haml ein]
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So erhalten Sie den Inhalt starker Parameter
Wie erstelle ich einen MOD für Slay the Spire?
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
[Schienen] So zeigen Sie Bilder in der Ansicht an
So installieren Sie Docker in der lokalen Umgebung einer vorhandenen Rails-App [Rails 6 / MySQL 8]
[Rails] So löschen Sie MySQL-Daten aus der Produktionsumgebung, nachdem Sie sie in die Entwicklungsumgebung gestellt haben
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
[Schienen] Wie man Samen macht
[Rails] So zeigen Sie die Wettervorhersage der registrierten Adresse auf Japanisch mit OpenWeatherMap an
[Rails] Verarbeitung nach Hinzufügen einer Spalte zur Entwicklertabelle
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
[Ruby] So rufen Sie den Inhalt des Doppel-Hash ab
So fügen Sie dieselben Indizes in ein verschachteltes Array ein
So leiten Sie den letzten Tag des Monats in Java ab
Ich habe einen RESAS-API-Client in Java erstellt
[Rails] Bei der Beschreibung der Validierung ist Vorsicht geboten
[jsoup] So erhalten Sie die gesamte Dokumentation
[Schienen] Anzeigen von Informationen, die in der Datenbank gespeichert sind
[Rails Tutorial Kapitel 2] Was tun, wenn Sie einen Fehlern im Spaltennamen machen?
So erstellen Sie einen Java-Container
So erstellen Sie einen JDBC-Treiber
So erstellen Sie ein Jenkins-Plug-In
Wie erstelle ich ein Maven-Projekt?
So erstellen Sie ein Java-Array
So installieren Sie Swiper in Rails
[Rails / Routing] So verweisen Sie auf den Controller in Ihrem eigenen Verzeichnis
[Rails] So erhalten Sie die URL der Übergangsquelle und leiten sie um