Rails: ошибка MySQL2 при нажатии кнопки поиска модели

#mysql #ruby-on-rails

#mysql #ruby-on-rails

Вопрос:

с Rails я столкнулся с этим:

 User.find(:all, :conditions => ["character = ?", character])
  

character это фиксированное число, как вы можете видеть по тому, как оно переведено для sql. Ожидается значение Fixnum.

Затем я получаю эту ошибку:

 Mysql2::Error: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near '= 5)'
at line 1: SELECT `users`.* FROM `users` WHERE (character = 5)
  

Я несколько сбит с толку и абсолютно не понимаю, что может быть не так с этой строкой sql.

Пожалуйста, помогите.

Ваш

Йорн

Комментарии:

1. Я уже пробовал проверять > и < символами -1 и 1 — все не помогло, та же ошибка

2. и я уже явно установил кодировку в UTF8 и сохранил файл

Ответ №1:

Проблема в том, что character это ключевое слово в mysql. Если вы экранируете это в обратных ссылках, это должно сработать, например

 User.find(:all, :conditions => ["`character` = ?", character])
  

Когда вы выполняете rails find, подобный

 User.where(:character => character)
  

как предполагает Рич Пек, тогда rails автоматически экранирует имена всех полей, чтобы предотвратить эту проблему: вы можете увидеть, как это делается в вашем журнале.

РЕДАКТИРОВАТЬ: возможно, в долгосрочной перспективе вам будет проще изменить название вашего столбца.

Ответ №2:

ActiveRecord

При использовании Rails 4 вам следует использовать это для поиска нескольких записей:

 User.where character: character
  

Если вы хотите загрузить определенную запись, вы можете просто использовать .find вот так:

 User.find_by character: character
  

Специфический

Я думаю, что ваша ошибка скорее связана с ActiveRecord, чем с Fixnum одним — тот факт, что вы используете эти данные для поиска записей, не должен иметь никакого отношения.

Я могу ошибаться, но я думаю, что суть в том, что вы используете методы ActiveRecord, которые вы определили.