[RAILS] ActiveRecord :: StatementInvalid (SQLite3 :: SQLException: aucune table de ce type: main.follows ~

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.

Cause

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

ActiveRecord :: StatementInvalid (SQLite3 :: SQLException: aucune table de ce type: main.follows ~
[Android] aucune solution d'erreur de table de ce type
ActiveRecord :: StatementInvalid: SQLite3 :: BusyException: la base de données est verrouillée
RSpec donne ActiveRecord :: StatementInvalid: Impossible de trouver la table