2

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

1 回答 1

8

天啦噜,其实我自己也想通了。只需删除方法定义中的连接:

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

这就是我想要的。

于 2012-02-22T15:53:28.480 回答