0

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”标签。]

4

1 回答 1

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 = ? ORs 取决于数组的大小,并将传入 postgreSQL 应该乐于容纳的 int 。

于 2012-04-25T23:02:37.793 回答