控制器#方法中的ActiveRecord :: StatementInvalid

时间:2015-06-10 09:48:48

标签: ruby-on-rails ruby ruby-on-rails-4

我正在进行复杂的搜索,为此我有特殊模型:

create_table "cmdb_searches", force: :cascade do |t|
  t.string   "client"
  t.string   "in"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

和evms_controller中的方法搜索:

def search
  @cisearch = CmdbSearch.new(search_params)
  @evms = Evm.order('id DESC')
  @evms = @evms.where('client_name=?',@cisearch.client) if #cisearch.client.present?
  @evms = @evms.where('in=?',@cisearch.in) if @cisearch.in.present?
  respond_to do |format|
    format.js
  end
end

我的js文件用响应填充了适当的div。如果我将表格留空或只填写:客户字段,但是如果我填写:在字段中它将返回错误:

SQLite3::SQLException: near "in": syntax error: SELECT "evms".* FROM "evms" WHERE (in='234543')  ORDER BY id DESC

4 个答案:

答案 0 :(得分:5)

in is an SQL operator。虽然从技术上讲你可以将它用作列名,但是你必须将其用于逃避它。这就是我试图避免在查询中使用纯SQL的原因。

@evms.where('in=?',@cisearch.in)替换为@evms.where(in: @cisearch.in)。这样它就可以正常逃脱。

答案 1 :(得分:2)

您无法为列in命名。因为这是SQLite中的保留关键字,它会立即生成错误。

答案 2 :(得分:2)

in是保留关键字。这就是为什么SQLite或任何以in作为其中一个关键字的DBMS会抛出此错误的原因。我建议您将列名更改为其他名称,例如within。否则你必须确保在查询中一直逃脱(引用:``)。

答案 3 :(得分:1)

in是sql中的保留字。您必须引用它,以便将其作为列名称。

使用标准的arel表示法将被正确引用

where(:in => @cisearch.in)

或用反引号手动引用它 where("`in` = ?",@cisearch.in)