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?
def following?(other_user)
self.followings.include?(other_user)
end
Eine Methode, die bestimmt, ob das durch das Argument angegebene Element im Array enthalten ist
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
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.
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).
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.
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
routes.rb
resources :users do
member do
get :following, :followers
end
end
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.
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