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?
def following?(other_user)
self.followings.include?(other_user)
end
Une méthode qui détermine si l'élément spécifié par l'argument est inclus dans le tableau
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
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.
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).
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.
`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
routes.rb
resources :users do
member do
get :following, :followers
end
end
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.
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