像操作员rails一样的sql上的mysql错误

时间:2017-12-02 02:01:55

标签: mysql ruby-on-rails ruby rails-activerecord

我收到错误

  

Mysql2 ::错误:您的SQL语法中有错误;检查手册   对应于您的MySQL服务器版本,以获得正确的语法   在“%预订%”附近使用

我该如何解决这个问题?

模型

scope :with_type, lambda { |type|
   where("LOWER(reservations.message) LIKE %#{type}%")
}

服务器上的Sql语句

SELECT  `reservations`.*
FROM `reservations`
LEFT OUTER JOIN `users` ON `users`.`id` = `reservations`.`from_id`
WHERE (`users`.`access_level_id` != 1)
AND `reservations`.`id_to` IS NULL
AND (LOWER(reservations.message) LIKE %booked%)
ORDER BY reservations.created_at desc LIMIT 10 OFFSET 0)

1 个答案:

答案 0 :(得分:2)

SQL LIKE运算符双方都使用字符串,因此您要生成的SQL是:

LOWER(reservations.message) LIKE '%booked%'

即。单引号%booked%。最简单的方法是在您的范围内使用占位符:

scope :with_type, ->(type) { where('LOWER(reservations.message) LIKE ?', "%#{type}%") }

将字符串插值放在Ruby中并将该字符串传递给where以引用它,这样您也可以防止注入问题。