1

Qucik 问题,为什么第二行代码有效而第一行无效?

Detail.find_by_sql("SELECT * FROM details INNER JOIN players ON players.id = details.player_id WHERE players.team_id = ?", self.id)
Detail.find_by_sql("SELECT * FROM details INNER JOIN players ON players.id = details.player_id WHERE players.team_id = '#{self.id}'")

第一行给了我 MySQL 错误,看起来它没有将参数传递给 SQL

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1: SELECT * FROM details INNER JOIN players ON players.id = details.player_id WHERE players.team_id = ?
4

3 回答 3

4

你必须像这样使用它:

Detail.find_by_sql(["SELECT * FROM details INNER JOIN players ON players.id = details.player_id WHERE players.team_id = ?", self.id])
于 2013-09-21T15:51:50.117 回答
1

想评论 AshwinKumarS 的回答,但似乎我没有代表点,所以我必须在这里发帖。他给出了正确的答案,但没有任何解释。是的,find_by_sql只接受一个数组作为其参数。如果您查看API 文档,它会给出错误的方法签名(将sql参数显示为独立于绑定数组,但它下面的示例是正确的)。我只是浪费了一个小时,试图调试由此引起的问题(当然它显示为 MySQL 语法错误而不是 Rails 错误 - 非常令人困惑和令人沮丧!)因为这种方法只接受一个单一的、平面的数组,如果您有很多或可变数量的参数要传递,请这样做:

Detail.find_by_sql(["SELECT * FROM blah WHERE column1 = ? AND column2 in (?,?,?)", array_of_values].flatten)
于 2018-04-11T02:55:44.880 回答
0

使用 rails 语法时,find_by_sql 仅支持 sql 查询

您应该像这样用 sql 语法编写查询:

Detail.find_by_sql("SELECT * FROM details INNER JOIN players ON players.id = details.player_id WHERE players.team_id = #{self.id}")

或者,您也可以在 rails 语法中找到它:

Detail.joins(:player).where("players.team_id = ?", self.id)
于 2013-09-21T15:54:44.420 回答