[RUBY] Comment créer une combinaison unique de données dans la table intermédiaire des rails

introduction

Comme Twitter, un utilisateur peut aimer plusieurs tweets et un tweet aime plusieurs utilisateurs Je pense que nous implémentons souvent des relations plusieurs-à-plusieurs telles que! La combinaison doit être unique, car certains utilisateurs n'aiment qu'un seul tweet par tweet. Cette fois, je vais vous expliquer comment rendre unique la combinaison de données dans la table intermédiaire.

Environnement de développement

Rails 6.0.3 Ruby 2.7.1 Test: Rspec, FactoryBot, devrait correspondre

1. Tableau

Les trois tableaux suivants sont utilisés cette fois.

Table des utilisateurs

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

Tableau des tweets

id content
1 tweet1
2 tweet2

Comme table (table intermédiaire)

id user_id tweet_id
1 1 2
2 1 3

Relation plusieurs à plusieurs

Je vais omettre l'explication de plusieurs à plusieurs cette fois.

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. Comment rendre une combinaison unique

Et c'est la mise en œuvre principale cette fois. Il y a deux choses à faire.

  1. Ajoutez une contrainte unique au fichier de migration avec add_index (constrain DB)
  2. Ajouter la validation au modèle de la table intermédiaire (ajouter la validation côté application)

2.1 Ajouter une contrainte unique au fichier de migration avec add_index

Ajoutez ʻadd_index: likes, [: user_id ,: tweet_id], unique: true` au fichier de migration de la table intermédiaire. N'oubliez pas de migrer après l'ajout!

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   #Ajouter ici
  end
end

2.2 Ajouter une validation au modèle de table intermédiaire

Ajoutez validates: hotel_id, uniqueness: {scope :: staff_id} au modèle de table intermédiaire.

like.rb


class Like < ApplicationRecord
  belongs_to :user
  belongs_to :tweet

  validates :user_id, uniqueness: { scope: :tweet_id }  #Ajouter ici
end

C'est toute la mise en œuvre requise. Assurez-vous que vous ne pouvez enregistrer la même combinaison qu'une seule fois dans la console.

3. Test Rspec pour garantir l'unicité

Pour référence, nous présenterons également le test. On suppose que les correspondances Rspec, FactoryBot et shoulda ont été définies.

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) }  #Vérifiez la relation plusieurs-à-plusieurs entre cette ligne et la ligne ci-dessous
  it { should belong_to(:tweet) }
  it { is_expected.to validate_uniqueness_of(:user_id).scoped_to(:tweet_id) } #Assurez-vous qu'il est unique ici
end

en conclusion

Avez-vous rendu la combinaison unique? Je pense que des implémentations comme celle-ci sont souvent utilisées, donc j'espère que vous la trouverez utile.

Recommended Posts

Comment créer une combinaison unique de données dans la table intermédiaire des rails
Comment effacer toutes les données d'une table particulière
[Rails] Comment changer le nom de colonne de la table
Comment supprimer de grandes quantités de données dans Rails et problèmes
Comment modifier le nombre maximum et maximum de données POST dans Spark
Comment changer la valeur d'une variable à un point d'arrêt dans intelliJ
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
Comment faire de https le schéma de l'URL générée par l'assistant d'URL de Rails
[Order method] Définit l'ordre des données dans Rails
Faire une marge à gauche du TextField
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment utiliser JQuery dans Rails 6 js.erb
(Ruby on Rails6) Création de données dans une table
Comment vérifier les commandes Rails dans le terminal
[Ruby on Rails] Comment faire de la destination du lien une partie de l'ID spécifié
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment régler l'heure d'affichage sur l'heure japonaise dans les rails
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Comment créer un URI de données (base64) en Java
[Ruby / Rails] Définissez une valeur unique (unique) dans la classe
[Comment insérer une vidéo dans un hameau avec Rails]
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment obtenir le contenu des paramètres forts
Comment faire un MOD pour Slay the Spire
[Rails] Comment charger JavaScript dans une vue spécifique
[Rails] Comment afficher les images dans la vue
Comment installer Docker dans l'environnement local d'une application Rails existante [Rails 6 / MySQL 8]
[Rails] Comment supprimer les données MySQL de l'environnement de production après les avoir placées dans l'environnement de développement
[Rails] Je souhaite afficher la destination du lien de link_to dans un onglet séparé
[Rails] Comment faire des graines
[Rails] Comment afficher les prévisions météo de l'adresse enregistrée en japonais en utilisant OpenWeatherMap
[Rails] Traitement après l'ajout d'une colonne à la table de devise
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
[Ruby] Comment récupérer le contenu du double hachage
Comment ajouter les mêmes index dans un tableau imbriqué
Comment dériver le dernier jour du mois en Java
J'ai créé un client RESAS-API en Java
[Rails] Où faire attention dans la description de la validation
[jsoup] Comment obtenir la totalité de la documentation
[Rails] Comment afficher les informations stockées dans la base de données dans la vue
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Comment créer un conteneur Java
Comment créer un pilote JDBC
Comment créer un plug-in Jenkins
Comment faire un projet Maven
Comment créer un tableau Java
Comment installer Swiper in Rails
[Rails / Routing] Comment faire référence au contrôleur dans votre propre répertoire
[Rails] Comment obtenir l'URL de la source de transition et la rediriger