Ich bin in Abschnitt 11.3.1 des Rails-Tutorials, und alle Tests waren vorher erfolgreich. Danach bricht die Startseite (die den Micropost-Feed enthält) mit diesem Fehler ab:
PG::Error: ERROR: invalid input syntax for integer: "98, 1"
LINE 1: ...CT COUNT(*) FROM "microposts" WHERE (user_id IN ('98, 1') O...
^
: SELECT COUNT(*) FROM "microposts" WHERE (user_id IN ('98, 1') OR user_id = 101)
Und mehrere der Tests scheitern an einem ähnlichen Problem. Hier ist der erste:
1) Authentication authorization as wrong user visiting Users#edit page
Failure/Error: before { visit edit_user_path(wrong_user) }
ActionView::Template::Error:
PG::Error: ERROR: invalid input syntax for integer: ""
LINE 1: ...CT COUNT(*) FROM "microposts" WHERE (user_id IN ('') OR use...
^
Ich verwende PostgreSQL anstelle des Standard-SQLite3, es kann also sein, dass es einen Syntaxkonflikt gibt, aber ich bin mir nicht sicher. Ich bin nicht super vertraut mit Postgres (ich verwende es nur, um die Heroku Bereitstellung sauberer zu machen).
Es sieht so aus, als ob der Homepage-Fehler von den ids kommt, die mit Anführungszeichen an die Abfrage übergeben werden - ich ging in psql, um ein paar Abfragen zu testen, und das ist erfolgreich:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN (1,2,3);
während dies nicht gelingt:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('1,2,3');
Und der spec-Fehler kommt von einem leeren Array übergeben wird, äquivalent zu diesem, die auch fehlschlägt:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('');
Kann mir jemand, der mit der PostgreSQL-Syntax vertraut ist, sagen, wie ich die Methodendefinition umschreiben kann, um dieses Problem zu beheben?
Die derzeitige Methode in micropost.rb
sieht so aus:
def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids.join(', ')
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end
Und der Aufruf von `users.rb' sieht wie folgt aus:
def feed
Micropost.from_users_followed_by(self)
end
0 Stimmen
Vorbereitete Anweisungen scheitern, wenn Sie etwas wie den Aufbau einer
IN(...)
Liste - der Ersteller ist ziemlich dumm und erkennt nicht, dass es sich um eine durch Kommata getrennte Liste und nicht um einen einzigen festen Datenblock handeln sollte.