[RUBY] Où la fonction de suivi est implémentée

méthode find_or_create_by

def follow(other_user)
  unless self == other_user #Essayer de suivre les autres_Vérifiez que l'utilisateur n'est pas lui-même
    self.relationships.find_or_create_by(follow_id: other_user.id)
  end
end

S'il y a des données qui remplissent la condition de l'argument, renvoyez-le find_by (other_user), sinon créez un nouveau create (other_user) Enregistrer après en avoir créé un nouveau

Article de référence: Quelle est la différence entre find_or_initialize_by et find_or_create_by?

comprend la méthode

def following?(other_user)
  self.followings.include?(other_user)
end
Quelle est la méthode include?

Une méthode qui détermine si l'élément spécifié par l'argument est inclus dans le tableau

fichier de migration de modèle de relation

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 et suivants_Paramètre pour empêcher la même combinaison d'identifiant
    end
  end
end

Je comprends que ʻadd_index ajoute un index, mais quel est le but de l'index en premier lieu? Cet article a été utile car je n'ai pas compris la signification de la description de ʻadd_index.

Article de référence: Comment mettre un index dans la base de données

Q. À quoi sert l'indice?

Pour faciliter la recherche lors de la récupération de données à partir de colonnes. Par exemple, cette fois pour faciliter la recherche d'abonnés dans la colonne des abonnés. Je n'ai pas besoin d'avoir seulement 3 personnes dans les données, mais quand il s'agit de 10 000 personnes, la recherche prend du temps, il semble donc préférable de l'ajouter.

add_Comment écrire un index


add_index :nom de la table,Nom de colonne

Dans l'exemple ci-dessus, il s'agit de la colonne suivante_id de la table de relations et de la colonne suivante_id de la table de relations.

Comment écrire un modèle utilisateur

user.rb


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

Le modèle follwing_relationships n'existe pas vraiment. C'est juste réglé comme ça pour plus de commodité. Ce modèle est un modèle des personnes qui suivent. Donc follower_id est défini avec une clé externe.

class_name:" Relationship " Comme je l'ai dit plus tôt, le modèle follwing_relationships n'existe pas réellement, et il existe réellement, donc le nom est follwing_relationships. , Le nom seul signifie vraiment "Relation".

dependant :: destroy C'est assez simple, et lorsqu'un utilisateur disparaît, la relation avec les personnes que l'utilisateur suit disparaît. Le modèle utilisateur et le modèle de relation ont une relation de dépendance, et lorsque l'utilisateur disparaît, la relation (relation entre l'utilisateur et follow_ids) de cet utilisateur disparaît également.

user.rb


has_many :follwings, through: :following_relationships

L'association entre les modèles est définie par has_many: follwings (nom du modèle). through :: following_relationships Ceci montre une table intermédiaire. Il est apparu plusieurs fois, mais le nom est «following_relationships», mais en réalité «relations» est la table intermédiaire.

Le fait est qu'il existe un modèle de relation entre les deux modèles utilisateur, le modèle utilisateur (personnes suivies) et le modèle utilisateur (personnes suivies).

Deux conditions d'utilisation de l'association
  1. Les relations sont définies dans la classe de modèle avec des méthodes telles que has_many et appartient_to
  2. Il existe une colonne appelée model name_id qui appartient à la table à laquelle elle appartient

Notez surtout que 2. est facile à oublier !! Cette fois, following_id est requis, mais si vous regardez le fichier de migration ci-dessus, vous pouvez voir que following_id y est placé, mais cette fois c'est OK car il y est défini.

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

La méthode find_by n'en renvoie qu'une. Ainsi, si vous définissez cela, vous pouvez identifier l'utilisateur que vous souhaitez rechercher. Article de référence: [[Rails] Divers usages de la méthode find_by la plus détaillée au monde](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)

«créer!» signifie enregistrer tel quel.

Le dernier est de trouver un utilisateur et de supprimer la méthode .destroy, supprimez donc ces données.

Ce que je ne comprends toujours pas, c'est pourquoi écrire une méthode dans un modèle? Normalement, je pensais qu'une telle méthode serait écrite dans le contrôleur. Quand j'ai cherché, j'ai trouvé cet article. Comment utiliser les méthodes que j'ai écrites dans le modèle Rails sur le contrôleur?

J'ai découvert que la description du contrôleur était aussi simple que possible. Ça ressemble à ça. Certes, si vous écrivez la description ci-dessus dans le contrôleur, ce sera déroutant et difficile à comprendre.

Erreur de fichier My Gresh Sean

`Causé par: Mysql2 :: Erreur: La table '(nom de l'application) _development.relationships' n'existe pas ' J'ai recherché "la table de migration n'existe pas" et j'ai trouvé cet article. Article de référence: Notes sur la migration des fichiers après la migration vers Rails 5.1

routage

routes.rb


resources :users do
  member do
    get :following, :followers
  end
end
Q. Qu'est-ce que «membre»? Que voulez-vous dire?

Article de référence: J'ai essayé d'expliquer la différence entre les membres et les collections dans routes.rb of rails d'une manière facile à comprendre. ~ Rails de débutant à intermédiaire ~

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

Comme vous pouvez le voir à partir de l'URL,: id sera ajouté automatiquement.

Articles que j'ai utilisés comme référence

Ajoutez une fonction de suivi avec des rails. J'ai implémenté la fonction de suivi en regardant cet article. Comment mettre un index dans la base de données Quelle est la différence entre find_or_initialize_by et find_or_create_by? Comment utiliser les méthodes que j'ai écrites dans le modèle Rails sur le contrôleur?

Recommended Posts

Où la fonction de suivi est implémentée
Suivez l'implémentation de la fonction (Ajax)
Où est le fuseau horaire de Java LocalDateTime.now ()?
Fonction similaire La partie bloquée pour la rendre asynchrone
[Ruby on Rails] Suivez l'implémentation de la fonction: bidirectionnelle
[Rails] Je vais expliquer la procédure d'implémentation de la fonction follow en utilisant form_with.
Les rails suivent la fonction
[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
[Swift] C'est la solution! Illustration de la mise en œuvre du délégué
À propos de la double fonction -java
Implémentation de la fonction de recherche
Comprenons la fonction!
Mise en œuvre de la fonction de pagénation
Fonction de recherche [implémentation copier-coller]
[Java] Notez le cas où égal est faux mais == est ture.
Suivre le mémorandum d'association de fonction (comprendre la description du modèle utilisateur)
Fonction de chat mise à jour instantanément (implémentation d'Action Cable)