Ruby on Railsチュートリアルの著者は、テキスト内のエラーの報告を受けて喜んでいると言いますが、すぐに彼は実際に何かがあるとは思わないと言いますので、直接彼に報告しないでください。それにもかかわらず、私はそのような誤りを発見したかもしれないと信じています。以下のメソッドが定義されているチュートリアルの3.2バージョンの11.44コードリストに:Ruby on Rails 3.2チュートリアルの第11章でのSQL補間のバグ?
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
の方法の最初の行は、(参加する呼び出しの文字列を生成します)。 2番目の行は、その文字列をSQL WHERE句のIN部分のカッコ内のプレースホルダに挿入します。私はこれをデフォルトのSQLiteドライバでテストしていません。なぜなら、高度な演習のための作者の指示に従っていて、テストと開発環境のためにPostgreSQLに切り替えたからです。 PostgreSQLドライバでは、プレースホルダ置換メカニズムは、そのプレースホルダの置換変数が文字列値であることを検出し、SQLが文字列値に期待する周囲の一重引用符で値を挿入します。その結果、WHERE節は "WHERE user_id IN ('...') OR ...
"となります。 user_id列はINT列なので、これは拒否されます(少なくともPostgreSQLでは)。この問題は後で、サブクエリを使用してメソッドのバリアント実装によってテキスト内で取り除かれますが、著者は明示的に、上に引用した失敗したコードを追加した後、テストスイート内のすべてのバリデーションを渡す必要があります。
このフォーラムでは、このフォーラムでこのバグレポートを監視している場合は、これが実際にバグかどうかを確認し、おそらくそれを修正したという応答を得るのは良いことです。 :-)
ありがとう!
[PS:著者は、タグ「ルビーオンレール」と「チュートリアル」を使用して、ここにバグを報告するために読者を指示したがSO「チュートリアル」タグの使用を許可していません。]
私の解決策があなたのために働いているかどうか教えてください。有用であれば、それをチェックしてください。それは* SOのポイントです。 – Jonathan