我在Rails 教程的第 11.3.1 节中,在此之前所有测试都通过了。之后,主页(具有微博提要)因以下错误而中断:
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)
并且有几个测试因类似的问题而失败。这是第一个:
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...
^
现在,我使用的是 PostgreSQL 而不是默认的 SQLite3,所以可能存在语法冲突,但我并不肯定。我对 Postgres 不是很熟悉(只是用它来使 Heroku 部署更干净)。
看起来主页错误来自通过引号传递给查询的 id - 我进入 psql 测试了一些查询,这是成功的:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN (1,2,3);
虽然这失败了:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('1,2,3');
并且规范错误来自一个正在传递的空数组,相当于这个,它也失败了:
SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('');
任何熟悉 PostgreSQL 语法的人都可以告诉我如何重写方法定义来解决这个问题吗?
中的当前方法micropost.rb
如下所示:
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
来自 `users.rb' 的调用如下所示:
def feed
Micropost.from_users_followed_by(self)
end