[RAILS] ActiveRecord :: StatementInvalid (SQLite3 :: SQLException: keine solche Tabelle: main.follows ~

Erstellen Sie ein Benutzermodell und ein Zwischentabellen-Beziehungsmodell, um die folgende Funktion zu implementieren.

model/user.rb


.
.
  def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end

Als ich eine solche Follow-Methode erstellt und in der entsprechenden Aktion von relation_controller aufgerufen habe, ist ein Fehler im Titel aufgetreten.

Es wird gesagt, dass es keine Tabelle gibt, aber ich war verwirrt, weil ich anhand der Schemadatei bestätigen konnte, dass es eine erforderliche Tabelle gab.

Ursache

Die Ursache war ein Problem mit der Migrationsdatei beim Erstellen der Beziehungstabelle

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

Dies wurde durch den Teil verursacht, der die Spalte "follow_id" erstellt, den Teil, in dem "Foreign_key" von "t.references: follow, Foreign_key: true" wahr ist. Wenn Foreign_key true ist, wird überprüft, ob dieselbe Tabelle wie der ID-Name vorhanden ist, dh ob eine Folgetabelle nicht vorhanden ist. Es scheint also, dass ein Fehler ausgegeben wurde.

Als Lösung im entsprechenden Teil

db/migrate/time_create_relationships.rb



 t.references :follow,  foreign_key: { to_table: :users }

Es funktionierte korrekt, indem eine Tabelle geschrieben wurde, auf die verwiesen wird.

Bitte beachten Sie, dass die Migrationsdatei, die automatisch im Terminal mit den folgenden "Rails g-Modellbeziehungen" erstellt wird: Verweise "standardmäßig" Foreign_key: True "ist.

Recommended Posts

ActiveRecord :: StatementInvalid (SQLite3 :: SQLException: keine solche Tabelle: main.follows ~
[Android] keine solche Tabellenfehlerlösung
ActiveRecord :: StatementInvalid: SQLite3 :: BusyException: Datenbank ist gesperrt
RSpec gibt ActiveRecord :: StatementInvalid an: Tabelle konnte nicht gefunden werden