Créez un modèle utilisateur et un modèle de relation de table intermédiaire pour implémenter la fonction suivante.
model/user.rb
.
.
def follow(other_user)
unless self == other_user
self.relationships.find_or_create_by(follow_id: other_user.id)
end
end
Lorsque j'ai créé une méthode de suivi comme celle-ci et l'ai appelée dans l'action correspondante de relation_controller, une erreur dans le titre est apparue.
On dit qu'il n'y a pas de table, mais j'étais confus car je pouvais confirmer à partir du fichier de schéma qu'il y avait une table nécessaire.
La cause était un problème avec le fichier de migration lors de la création de la table de relations
db/migrate/time_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.2]
def change
create_table :relationships do |t|
t.references :user, foreign_key: true
t.references :follow, foreign_key: true
t.timestamps
end
add_index :relationships, [:user_id, :follow_id], unique: true
end
end
Cela était dû à la partie qui crée la colonne follow_id, la partie où la clé étrangère de t.references: follow, la clé étrangère: true
est vraie.
Si Foreign_key est vrai, il vérifiera si la même table que le nom d'id existe, c'est-à-dire s'il existe une table de suivi qui n'existe pas, il semble donc qu'une erreur a été levée.
Comme solution, dans la partie correspondante
db/migrate/time_create_relationships.rb
t.references :follow, foreign_key: { to_table: :users }
Cela a fonctionné correctement en écrivant un tableau qui fait référence.
Veuillez noter que le fichier de migration créé automatiquement dans le terminal avec les relations de modèle rails g suit: references
par défaut à Foreign_key: true
.
Recommended Posts