Ruby on Rails 教程的作者说他很高兴收到文本中的错误报告,但随后他立即继续说他并不真正期望有任何错误,所以请不要直接向他报告。不过,我相信我可能已经发现了这样的错误。在教程 3.2 版本的代码清单 11.44 中定义了以下方法:
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
该方法的第一行通过调用 join() 生成一个字符串。第二行将该字符串插入 SQL WHERE 子句的 IN 部分括号内的占位符。我没有使用默认的 SQLite 驱动程序对此进行测试,因为我按照作者的说明进行了高级练习,并切换到 PostgreSQL 进行测试和开发环境。使用 PostgreSQL 驱动程序,占位符替换机制检测到该占位符的替换变量是一个字符串值,并插入带有单引号的值,SQL 期望该值用于字符串值。因此,生成的 WHERE 子句显示为“WHERE user_id IN ('...') OR ...
.” user_id 列是一个 INT 列,因此它被拒绝(至少在 PostgreSQL 中是这样)。该问题稍后在文本中通过使用子查询的方法的变体实现来消除,但作者在添加了上面引用的失败代码,测试套件中的所有验证都应该通过。
如果作者正在监视此论坛以获取有关本教程的错误报告,那么很高兴得到确认这是否确实是错误的响应,甚至可能已对其进行更正。:-)
谢谢!
[PS:作者在这里指导读者报告错误,使用标签“ruby-on-rails”和“tutorials”,但SO不允许使用“tutorials”标签。]