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
该方法的第一行产生一个字符串,与呼叫加入()。第二行将该字符串插入到SQL WHERE子句的IN部分的括号内的占位符中。我没有用默认的SQLite驱动测试这个,因为我遵循了作者的高级练习指令,并转而使用PostgreSQL作为测试和开发环境。通过PostgreSQL驱动程序,占位符替换机制检测到该占位符的替换变量是一个字符串值,并将该值与SQL预期用于字符串值的周围单引号标记一起插入。所以产生的WHERE子句以“WHERE user_id IN ('...') OR ...
”出现。 user_id列是一个INT列,因此这被拒绝(至少在PostgreSQL中)。这个问题在后面的文本中通过使用子查询的方法的变体实现来消除,但是作者明确地说,在添加上面引用的失败代码之后,测试套件中的所有验证都应该通过。
如果作者正在监视这个论坛上关于本教程的bug报告,最好能得到一个回应,确认这是否确实是一个错误,甚至可能纠正错误。 :-)
谢谢!
[PS:作者指导读者在这里报告错误,使用标签“的Ruby-on-轨”和“教程”,但等不允许使用“教程”标签]
让我知道如果我的解决方案为你工作,并请勾选/如果有用的话投票。那*是*的要点。 – Jonathan 2012-04-26 11:28:53