我正在进行复杂的搜索,为此我有特殊模型:
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
答案 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)