[RUBY] Befolgen Sie das Memorandum zur Funktionszuordnung (verstehen Sie die Beschreibung des Benutzermodells).

Inhaltsverzeichnis

Einführung

In den letzten Tagen hatte ich Mühe, die Zuordnung der Verfolgungsfunktion zu verstehen, aber ich habe es endlich geschafft, sie in mich selbst zu integrieren, sodass ich sie als Memorandum belassen werde.

Persönlich war ich verwirrt über die ** Beschreibung der Zuordnung zum Benutzermodell **, daher schreibe ich hauptsächlich darüber. Dieses Mal habe ich die Implementierung von View und Controller nicht angesprochen.

Also werde ich sofort anfangen.

Erstellen Sie eine Zwischentabelle, da es sich um viele zu viele handelt

Da die Zuordnung der folgenden Funktionen eine Viele-zu-Viele-Zuordnung (Benutzer-zu-Benutzer) ist, Es ist erforderlich, eine Zwischentabelle vorzubereiten und sie zu einer "Eins-zu-Viele" -Zuordnung (Benutzer-zu-Beziehungen) zu machen.

(Für diejenigen, die eins zu viele oder viele zu viele mögen, [[für Anfänger] Rails "Assoziation" Tutorial, das zu höflich ist [alles] [perfekt verstanden]](https://qiita.com/kazukimatsumoto/items/14bdff681ec5ddac26d1 #% E3% 83% 95% E3% 82% A9% E3% 83% AD% E3% 83% BC% E3% 83% 95% E3% 82% A9% E3% 83% AD% E3% 83% AF% E3% 83% BC% E6% A9% 9F% E8% 83% BD% E3% 82% 92er% E5% 9B% B3% E3% 82% 92% E4% BD% BF% E3% 81% A3% E3% 81% A6% E8% A8% AD% E8% A8% 88% E3% 81% 97% E3% 82% 88% E3% 81% 86) Ich empfehle den Artikel. Ich lernte.)

Erstellen Sie zunächst ein Beziehungsmodell.

$ rails g model Relationship

Fügen Sie der Migrationsdatei die folgende_ID (folgende Seiten-ID) und die folgende_ID (folgende Seiten-ID) hinzu.

202008111333110_create_relationships.rb


class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      #Anhänger
      t.integer :following_id
      #Gefolgte Seite
      t.integer :follower_id

      t.timestamps null: false
    end
    add_index :relationships, :following_id
    add_index :relationships, :follower_id    
    add_index :relationships, [:following_id, :follower_id], unique: true
  end
end

Vergiss nicht ...

$ rails db:migrate

Teilen Sie das Modell in zwei Teile (hier wichtig)

Von hier ** ① Den Follower anschauen ** ** ② Blick auf die zu befolgende Seite ** Es ist notwendig, zwischen den beiden zu unterscheiden. Seien Sie vorsichtig, da Sie nicht wissen, was es ist, wenn Sie es mehrdeutig machen!

Als allererstes ... ** 1. Denken Sie an das Beziehungsmodell in zwei Teilen ** ・ Active_relationships (Blick auf den Follower) ・ Passive_Beziehungen (aus der Sicht der Person, der gefolgt wird)

user.rb


class User < ApplicationRecord
  has_many :active_relationships, class_name: "Relationship", foreign_key: :following_id, dependent: :destroy
  has_many :passive_relationships, class_name: "Relationship", foreign_key: :follower_id, dependent: :destroy
end

Da es nur eine "Annahme" ist, dass ein Beziehungsmodell einen Namen erhält und in zwei Modelle unterteilt ist, muss in class_name beschrieben werden, dass es sich tatsächlich um ein Beziehungsmodell handelt.

Aus Sicht des Followers wird der Follower (follower_id) basierend auf dem Follower (follow_id) gezogen, sodass der Primärschlüssel (externer Schlüssel) als folgende_id angegeben werden muss.

Im Gegensatz dazu wird aus Sicht der Follower-Seite die Follower-Seite (follow_id) basierend auf der Follower-Seite (follower_id) gezogen, sodass der Primärschlüssel (externer Schlüssel) als Follower_id angegeben werden muss.

** 2. Denken Sie an das Benutzermodell in zwei Teilen ** ・ Folgen (aus der Sicht des Nachfolgers) ・ Follower (die Sichtlinie des Followers)

relationship.rb


class Relationship < ApplicationRecord
  belongs_to :following, class_name: "User"
  belongs_to :follower, class_name: "User"
end

Wie beim Beziehungsmodell ist es nur eine "Annahme", dass einem Benutzermodell ein Name zugewiesen und in zwei Modelle unterteilt wird. Daher muss in class_name beschrieben werden, dass es sich tatsächlich um ein Benutzermodell handelt.

① Denken Sie aus der Perspektive des Nachfolgers

  1. Zeile: ** Beschreiben Sie das Beziehungsmodell (active_relationships, da es die Seite ist, der Sie hier folgen müssen) ** Es wurde bereits erläutert, wo das obige Beziehungsmodell in zwei Teile unterteilt ist.

Zeile 2: ** Sammeln Sie Personen, die über active_relationship verfolgt werden ** Sammeln Sie Leute, die durch active_relationships verfolgt werden. Um die Personen zu sammeln, denen gefolgt wird, beziehen Sie sich auf das "Follower" -Modell. Schreiben Sie also source :: follower. Da wir diese Reihe von Flows "Followings" genannt haben, beschreiben wir sie als has_many: followings.

user.rb


  has_many :active_relationships, class_name: "Relationship", foreign_key: :following_id
  has_many :followings, through: :active_relationships, source: :follower

② Denken Sie aus der Perspektive der Person, der Sie folgen

Zeile 1: ** Beschreiben Sie zunächst das Beziehungsmodell (passive_relationships hier) ** Es wurde bereits erläutert, wo das obige Beziehungsmodell in zwei Teile unterteilt ist.

Zeile 2: ** Sammeln Sie Personen, denen Sie über passive_relationship folgen ** Sammeln Sie Menschen, denen passive Beziehungen folgen. Um Personen zu sammeln, denen gefolgt wird, verweisen Sie auf das "folgende" Modell. Schreiben Sie also source :: follow. Da wir diese Reihe von Flows "Follower" genannt haben, schreiben wir sie als has_many: Follower.

user.rb


  has_many :passive_relationships, class_name: "Relationship", foreign_key: :follower_id
  has_many :followers, through: :passive_relationships, source: :following

Die endgültige Beschreibung für das Benutzermodell lautet also wie folgt.

user.rb


class User < ApplicationRecord
  #Die Sichtlinie des Nachfolgers
  has_many :active_relationships, class_name: "Relationship", foreign_key: :following_id
  has_many :followings, through: :active_relationships, source: :follower

  #Blick auf die Seite, der man folgen muss
  has_many :passive_relationships, class_name: "Relationship", foreign_key: :follower_id
  has_many :followers, through: :passive_relationships, source: :following
end

Das ist das Ende.

Zusammenfassung

Um die Verfolgungsfunktion abzuschließen, müssen Ansicht und Steuerung getrennt implementiert werden.

Das heißt, ich habe tatsächlich erlebt und das Gefühl, dass der Berg der Implementierung von Follow-Funktionen darin besteht, "die Beschreibung des Benutzermodells zu verstehen". Wenn Sie diesen Berg überqueren, können Sie ihn problemlos implementieren. : Daumen hoch:

Ich denke, diesmal geht es darum, an jedes zweite Modell zu denken.

Erstens ist die Struktur, die sowohl der Follower als auch der Follower auf ein Modell namens Benutzermodell verweisen und die Daten einbringen, kompliziert, so dass es die Beziehung zwischen dem Post-Modell der gleichen Funktion und dem Benutzermodell zu sein scheint. Wenn Sie davon ausgehen, dass es sich bei dem Benutzermodell um zwei Modelle handelt (obwohl es sich tatsächlich um ein Modell handelt) und die Beziehungen organisieren, können Sie davon ausgehen, dass es sich möglicherweise um eine unerwartet einfache Geschichte handelt.

Vielen Dank, dass Sie so weit gelesen haben. Ich bin ein Anfänger, der noch nicht genug Wissen hat. Ich würde mich freuen, wenn Sie mir einen Rat geben könnten, wenn etwas nicht stimmt.

Recommended Posts

Befolgen Sie das Memorandum zur Funktionszuordnung (verstehen Sie die Beschreibung des Benutzermodells).
Lassen Sie uns die Funktion verstehen!
Informationen zur Beschreibung von Docker-compose.yml
Das Problem, dass das Attribut des Benutzermodells in ActionMailer gleich Null wird
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
[Rails] Implementierung der Benutzerrückzugsfunktion
Ein Memorandum über das FizzBuzz-Problem
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
So implementieren Sie die E-Mail-Authentifizierungsfunktion zum Zeitpunkt der Benutzerregistrierung
Verstehen Sie die Grundlagen von Android Audio Record
Implementierung der Benutzerauthentifizierungsfunktion mit devise (2)
Verstehe die offizielle Probe Coffee of Dagger2
Implementierung der Benutzerauthentifizierungsfunktion mit devise (1)
Wo die Follow-Funktion implementiert ist
Implementierung der Benutzerauthentifizierungsfunktion mit devise (3)