2015-06-10 3 views
1

Я делаю сложный поиск, и для этого у меня есть специальные модели:ActiveRecord :: StatementInvalid в контроллере метод #

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 

ответ

5

in is an SQL operator. Технически вы можете использовать его в качестве имени столбца, чтобы сделать это, вам нужно избежать этого. Вот почему я стараюсь избегать использования простого SQL в моих запросах.

Заменить @evms.where('in=?',@cisearch.in) на @evms.where(in: @cisearch.in). Таким образом, он будет сбежать должным образом.

2

Вы не можете назвать вашу колонку in. Поскольку это зарезервированное ключевое слово в SQLite, и оно будет генерировать ошибки, поскольку оно вызывает прямо сейчас.

1

in зарезервированное слово в sql. Вы должны процитировать его так, чтобы оно принималось как имя столбца.

Используя стандартные AREL обозначения будут цитироваться

where(:in => @cisearch.in) 

или процитировать его вручную с кавычкой where("`in` = ?",@cisearch.in)

2

in - зарезервированное ключевое слово. Вот почему SQLite или любая СУБД, которая имеет in в качестве своего одного из ключевых слов, выкинет эту ошибку. Я бы рекомендовал вам изменить имя столбца на что-то еще, например within. В противном случае вам нужно будет убежать (quote: ``) все время в ваших запросах.

Смежные вопросы