2012-04-25 128 views
0

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-轨”和“教程”,但等不允许使用“教程”标签]

+0

让我知道如果我的解决方案为你工作,并请勾选/如果有用的话投票。那*是*的要点。 – Jonathan 2012-04-26 11:28:53

回答

0

要解决这个问题,你可以使用:

def self.from_users_followed_by(user) 
    followed_user_ids = user.followed_user_ids 
    where((['user_id = ?'] * followed_user_ids.size).join(' OR '), *followed_user_ids) 
    end 

这将建立很多user_id = ? OR的依附对数组的大小的查询,将在INT PostgreSQL所应该是快乐的,以适应通过。

+0

感谢您的信息。然而,正如我在我的OP中指出的那样,我并没有真正寻找bug的解决方法(本教程本身提供了一种使用子查询的更好方法,它可以避免该错误)。我所追求的是一种让教程的作者知道错误在那里的方法,所以它可以被修复,读者在我之后不会花费尽可能多的时间,因为我试图找出什么是错误的破碎。 – 2012-04-27 18:48:26

+0

如果它解决了这个错误,它就解决了你的问题,如果它是一个问题,它就有正确和错误的答案,并且这些答案被投票或选择。只是说这个地方不是一个SEO慈善机构,这里给出的建议是有原因的。在反对指导方针的问题上你失去了我的赞同 – Jonathan 2012-04-27 18:53:48

相关问题