RailsTutorial 3.2第11章 - PostgreSQL语法错误会破坏状态提要

ell*_*ren 2 postgresql syntax ruby-on-rails ruby-on-rails-3 railstutorial.org

我在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)
Run Code Online (Sandbox Code Playgroud)

并且有几个测试因类似问题而失败.这是第一个:

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...
                                                                ^
Run Code Online (Sandbox Code Playgroud)

现在,我正在使用PostgreSQL而不是默认的SQLite3,因此可能存在语法冲突,但我并不积极.我对Postgres并不是很熟悉(只是使用它来使Heroku部署更清洁).

看起来主页错误来自使用引号传递给查询的ID - 我进入psql测试一些查询,这是成功的:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN (1,2,3);
Run Code Online (Sandbox Code Playgroud)

虽然失败了:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('1,2,3');
Run Code Online (Sandbox Code Playgroud)

并且spec错误来自传递的空数组,相当于此,它也会失败:

SELECT "microposts".* FROM "microposts" WHERE "microposts"."id" IN ('');
Run Code Online (Sandbox Code Playgroud)

任何熟悉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
Run Code Online (Sandbox Code Playgroud)

来自`users.rb'的调用如下所示:

def feed
    Micropost.from_users_followed_by(self)
end
Run Code Online (Sandbox Code Playgroud)

ell*_*ren 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
Run Code Online (Sandbox Code Playgroud)

user.followed_user_ids.join(', ') 产生这个:"1,2,3"

user.followed_user_ids 产生这个:1,2,3

这就是我想要的.