【问题标题】:Issue with Rails 2.3.5 Active Record Conditions for INRails 2.3.5 IN 的 Active Record 条件问题
【发布时间】:2012-06-07 19:38:29
【问题描述】:

我在使用带有 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”放在那里,我该如何摆脱它?

【问题讨论】:

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


    【解决方案1】:

    使用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)
    

    【讨论】:

      【解决方案2】:

      您已被引导至另一条路径。但要回答你的问题:

      为什么要在里面放“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 周期。

      【讨论】:

        【解决方案3】:

        我认为你不需要加入价值观。即使在 Rails 2 中。也就是说,试试这个:

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

        【讨论】:

          【解决方案4】:

          试试这个:

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-11-15
              • 1970-01-01
              • 2011-10-25
              • 2011-01-28
              相关资源
              最近更新 更多