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.
Rails 6.0.3 Ruby 2.7.1 Test: Rspec, FactoryBot, devrait correspondre
Les trois tableaux suivants sont utilisés cette fois.
id | name | |
---|---|---|
1 | Utilisateur 1 | [email protected] |
2 | Utilisateur 2 | [email protected] |
id | content |
---|---|
1 | tweet1 |
2 | tweet2 |
id | user_id | tweet_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
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
Et c'est la mise en œuvre principale cette fois. Il y a deux choses à faire.
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
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.
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
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.