[RUBY] Wo die Follow-Funktion implementiert ist

find_or_create_by Methode

def follow(other_user)
  unless self == other_user #Ich versuche anderen zu folgen_Stellen Sie sicher, dass der Benutzer nicht er selbst ist
    self.relationships.find_or_create_by(follow_id: other_user.id)
  end
end

Wenn Daten vorhanden sind, die die Bedingung des Arguments erfüllen, geben Sie sie "find_by (other_user)" zurück, andernfalls erstellen Sie ein neues "create (other_user)" Speichern Sie nach dem Erstellen eines neuen

Referenzartikel: Was ist der Unterschied zwischen find_or_initialize_by und find_or_create_by?

beinhaltet Methode

def following?(other_user)
  self.followings.include?(other_user)
end
Was ist die Include-Methode?

Eine Methode, die bestimmt, ob das durch das Argument angegebene Element im Array enthalten ist

Migrationsdatei für Beziehungsmodelle

class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :following_id

      t.timestamps null: false

      add_index :relationships, :follower_id
      add_index :relationships, :following_id
      add_index :relationships, [:follower_id, :follwing_id], unique: true #follow_ID und folgende_Einstellung, um die gleiche Kombination von IDs zu verhindern
    end
  end
end

Ich verstehe, dass add_index einen Index hinzufügt, aber was ist der Zweck des Index überhaupt? Dieser Artikel war hilfreich, weil ich die Bedeutung der Beschreibung von add_index nicht verstanden habe.

Referenzartikel: So fügen Sie einen Index in die Datenbank ein

F. Wofür ist der Index?

Um das Auffinden beim Abrufen von Daten aus Spalten zu erleichtern. In diesem Fall beispielsweise, um die Suche nach Followern in der Follower-Spalte zu vereinfachen. Ich muss nicht nur 3 Personen in den Daten haben, aber wenn es um 10.000 Personen geht, dauert die Suche einige Zeit, daher scheint es besser, sie hinzuzufügen.

add_Wie schreibe ich Index


add_index :Tabellenname,Spaltenname

Im obigen Beispiel ist es die folgende_id-Spalte der Beziehungstabelle und die folgende_id-Spalte der Beziehungstabelle.

So schreiben Sie ein Benutzermodell

user.rb


has_many :follwing_relationships, foreign_key: "follower_id", class_name: "Relationship", dependent: :destroy

Das Modell "follwing_relationships" existiert nicht wirklich. Es ist nur so eingestellt, um es bequemer zu machen. Dieses Modell ist ein Modell der Menschen, die folgen. Also wird follower_id mit einem externen Schlüssel gesetzt.

class_name:" Relationship " Wie ich bereits sagte, existiert das Modell follwing_relationships nicht wirklich und es existiert tatsächlich, daher lautet der Name follwing_relationships. Der Name allein bedeutet wirklich "Beziehung".

abhängige :: zerstören Dies ist ziemlich einfach, und wenn ein Benutzer verschwindet, verschwindet die Beziehung zu den Personen, denen der Benutzer folgt. Das Benutzermodell und das Beziehungsmodell sind untergeordnet, und wenn der Benutzer verschwindet, verschwindet auch die Beziehung (Beziehung zwischen dem Benutzer und follow_ids) dieses Benutzers.

user.rb


has_many :follwings, through: :following_relationships

Die Zuordnung zwischen Modellen wird durch "has_many: follwings (Modellname)" definiert. through :: follow_relationships Dies zeigt eine Zwischentabelle. Es ist mehrmals vorgekommen, aber der Name lautet "Following_Relationships", aber in Wirklichkeit ist "Relations" die Zwischentabelle.

Der Punkt ist, dass es ein Beziehungsmodell zwischen den beiden Benutzermodellen gibt, dem Benutzermodell (verfolgte Personen) und dem Benutzermodell (verfolgte Personen).

Zwei Bedingungen für die Verwendung des Vereins
  1. Beziehungen werden in der Modellklasse mit Methoden wie has_many und gehör_to definiert
  2. Es gibt eine Spalte mit dem Namen model name_id, die zu der Tabelle gehört, zu der sie gehört

Beachten Sie insbesondere, dass 2. leicht zu vergessen ist !! Dieses Mal ist follow_id erforderlich. Wenn Sie sich jedoch die obige Migrationsdatei ansehen, können Sie sehen, dass follow_id dort abgelegt ist. Diesmal ist es jedoch in Ordnung, da es dort definiert ist.

user.rb


def following?(other_user) 
  following_relationships.find_by(following_id: other_user.id)
end

def follow!(other_user)
  following_relationships.create!(following_id: other_user.id)
end

def unfollow!(other_user)
  following_relationships.find_by(following_id: other_user.id).destroy
end

Die Methode find_by gibt nur eine zurück. Wenn Sie dies einstellen, können Sie den Benutzer bestimmen, den Sie suchen möchten. Referenzartikel: [[Rails] Verschiedene Verwendungen der detailliertesten find_by-Methode der Welt](https://pikawaka.com/rails/find_by#find_by%E3%83%A1%E3%82%BD%E3%83% 83% E3% 83% 89% E3% 82% 92% E4% BD% BF% E7% 94% A8% E3% 81% 99% E3% 82% 8B% E5% A0% B4% E9% 9D% A2% E3% 81% A8% E3% 81% AF% EF% BC% 9F)

create! Bedeutet speichern, wie es ist.

Der letzte besteht darin, einen Benutzer zu finden und die Methode ".destroy" zu löschen. Löschen Sie also diese Daten.

Was ich immer noch nicht verstehe, ist, warum ich eine Methode in ein Modell schreibe? Normalerweise dachte ich, dass eine solche Methode in den Controller geschrieben werden würde. Bei der Suche habe ich diesen Artikel gefunden. Wie verwende ich die Methoden, die ich im Rails-Modell auf dem Controller geschrieben habe?

Was ich herausgefunden habe, war, die Beschreibung des Controllers so einfach wie möglich zu gestalten. Es scheint so. Wenn Sie die obige Beschreibung in den Controller schreiben, ist dies sicherlich verwirrend und schwer zu verstehen.

Mein Gresh Sean-Dateifehler

Verursacht durch: Mysql2 :: Fehler: Tabelle '(App-Name) _development.relationships' existiert nicht Ich habe nach "Migrationstabelle existiert nicht" gesucht und diesen Artikel gefunden. Referenzartikel: Hinweise zu Migrationsdateien nach der Migration auf Rails 5.1

Routing

routes.rb


resources :users do
  member do
    get :following, :followers
  end
end
Frage: Was ist "Mitglied"? Was meinst du?

Referenzartikel: Ich habe versucht, den Unterschied zwischen Mitgliedern und Sammlungen in route.rb von Schienen auf leicht verständliche Weise zu erklären. ~ Schienen vom Anfänger bis zum Fortgeschrittenen ~

following_user GET    /users/:id/following(.:format)                                                           users#following
followers_user GET    /users/:id/followers(.:format)                                                           users#followers

Wie Sie der URL entnehmen können, wird die ID automatisch hinzugefügt.

Artikel, die ich als Referenz verwendet habe

Fügen Sie eine Verfolgungsfunktion mit Schienen hinzu. Ich habe die Follow-Funktion implementiert, während ich mir diesen Artikel angesehen habe. So fügen Sie einen Index in die Datenbank ein Was ist der Unterschied zwischen find_or_initialize_by und find_or_create_by? Wie verwende ich die Methoden, die ich im Rails-Modell auf dem Controller geschrieben habe?

Recommended Posts

Wo die Follow-Funktion implementiert ist
Implementierung der Ajax-Funktion (Follow Function)
Wo ist die Zeitzone von Javas LocalDateTime.now ()?
Like-Funktion Der Teil, der feststeckt, um es asynchron zu machen
[Ruby on Rails] Folgen Sie der Funktionsimplementierung: Bidirektional
[Rails] Ich werde die Prozedur zum Implementieren der Follow-Funktion mit form_with erklären.
Schienen folgen der Funktion
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
[Swift] Das ist die Lösung! Abbildung der Implementierung des Delegierten
Über die Doppelfunktion -java
Implementierung der Suchfunktion
Lassen Sie uns die Funktion verstehen!
Implementierung der Pagenationsfunktion
Suchfunktion [Implementierung kopieren und einfügen]
[Java] Beachten Sie, dass der Fall, in dem gleich ist, falsch ist, aber == ist.
Befolgen Sie das Memorandum zur Funktionszuordnung (verstehen Sie die Beschreibung des Benutzermodells).
Sofort aktualisierte Chat-Funktion (Implementierung des Aktionskabels)