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.
Rails 6.0.3 Ruby 2.7.1 Test: Rspec, FactoryBot, Shoulda-Matcher
Die folgenden drei Tabellen werden dieses Mal verwendet.
id | name | |
---|---|---|
1 | Benutzer 1 | [email protected] |
2 | Benutzer 2 | [email protected] |
id | content |
---|---|
1 | tweet1 |
2 | tweet2 |
id | user_id | tweet_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 3 |
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
Und diesmal ist es die Hauptimplementierung. Es gibt zwei Dinge zu tun.
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
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.
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
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