RailsTutorial 3.2 Ch 11-PostgreSQL语法错误中断了状态提要



我在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

天哪,我真的自己想出来了。只需删除方法定义中的联接:

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

这正是我想要的。

最新更新