我在 Section 11.3.1的 Rails 教程,所有测试都在此之前通过。之后,主页(有微博提要)因以下错误而中断:
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
最佳答案
天哪,我居然自己想出来了。只需删除方法定义中的连接:
def self.from_users_followed_by(user)
followed_user_ids = user.followed_user_ids
where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end
user.followed_user_ids.join(', ')
产生这个:“1, 2, 3”
同时
user.followed_user_ids
产生这个:1, 2, 3
这就是我想要的。
关于ruby-on-rails - RailsTutorial 3.2 Ch 11 - PostgreSQL 语法错误中断状态提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9397954/