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”和“教程”但是SO不允许使用“教程”标签。]
答案 0 :(得分: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
取决于数组的大小,并将传入postgreSQL应该乐于容纳的int。