Rails的问题2.3.5 IN的活动记录条件

时间:2012-06-07 19:38:29

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-2

我在使用postgres的rails 2中使用活动记录条件时遇到问题。我的问题是,当我尝试使用此查询时(我使用geokit,但这不是问题)

Table.all(:conditions => ["id IN (?)", id_array.join(",")], :origin => origin, :within => 20)

我遇到了这个问题:

ActiveRecord::StatementInvalid: PG::Error: ERROR:  invalid input syntax for integer: "21,28"
LINE X: ...OM "tables" WHERE (((id IN (E'21,28...

为什么要把“E”放在那里以及如何摆脱它?

5 个答案:

答案 0 :(得分:3)

使用id_array.join(","),您将一个字符串传递给该函数。当所有字符串在生成的SQL查询中被转义并被单引号包围时,您自然会得到SQL错误,就像在此IN语句中一样,您只能使用以逗号分隔的整数。

简单的解决方案是直接将数组传递给函数。然后,ActiveRecord自己在SQL中创建正确的值。您可以像这样使用它:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)

或者,您可以使用这种类似ruby的语法生成完全相同的SQL查询:

Table.all(:conditions => {:id => id_array}, :origin => origin, :within => 20)

答案 1 :(得分:1)

您已被定向到另一条路径。但要回答你的问题:

  

为什么要把“E”放在那里......

那是escape string syntax of PostgreSQL。 PostgreSQL的默认行为已随版本9.1更改,不再解释反斜杠转义,除非在开头单引号前面有E。新行为反映了SQL标准。

 'one backslash: \'  -- backslash has no special meaning in Postgres 9.1
E'one backslash: \\' -- must use E'' syntax to interpret escape sequences

有些客户端可以安全地将E放在每个字符串文字的前面,以获得相同的行为,无论PostgreSQL版本或standard_conforming_strings的设置如何。其他人向服务器询问设置并相应地调整语法。无论哪种方式,将E放在不包含反斜杠的字符串文字前面只是浪费(极少数)CPU周期。

答案 2 :(得分:0)

我认为你不需要加入这些价值观。甚至在Rails 2.据说,试试这个:

Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)

答案 3 :(得分:0)

请改为尝试:

Table.all(:conditions => ["id IN (#{id_array.join(",")})"], :origin => origin, :within => 20

答案 4 :(得分:0)

我遇到了同样的问题,mysql试图运行count()函数和我用来修复它的语法

Issue.all(:conditions => "status_id IN (5, 15, 19, 21, 25)").count