2

私はRailsチュートリアルのSection 11.3.1に属しています。すべてのテストはそれ以前に行われていました。その後、マイクロポストフィードを持つホームページが次のエラーで破損します。RailsTutorial 3.2 Ch 11 - PostgreSQL構文エラーによりステータスフィードが破損する

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... 
                   ^

を私の代わりにデフォルトSQLite3のではPostgreSQLを使用していますので、それは構文の競合があることかもしれないが、私は肯定的ではないよ。ここでは最初のものです。私は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 
+0

'IN(...) 'リストを作成するときに準備された文が失敗する - 作成者がむしろ愚かであり、カンマで区切られたリストでなければならないことを理解していない。データ。 –

答えて

8

神聖ながらくた、私は実際に自分自身をこれを考え出しました。 "1、2、3"

user.followed_user_idsが生み出す

ながら、この:1、2、3

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

あなたがRubyで 'join 'すると、ARが引用する単一の文字列が得られます。 PostgreSQLは 'int IN(string)'が何を意味しているのか分からないため、エラーが発生します。配列の 'where'を渡すと、(必要に応じて)各要素を引用し、引用された要素をコンマで結合し、その結果をSQLにダンプします。 PostgreSQLは 'int IN(int、int、...)'が何を意味するのかを知っています。ところで、あなたはあなた自身の答えを受け入れることができます。 –

+0

これはチュートリアルのバグと同じくらいポストグルな問題ではないようですね。 – SingleShot

+1

真実、私は答えを見つけた後までそれを理解しませんでした。私はそれについての作者に電子メールを送った。彼はそれが本物のバグであり、次のリビジョンで修正されると言いました(おそらくすでにあります)。 – ellawren

関連する問題