3

如何删除变量周围的引号,以便可以在 rails 的 find_by_sql 中使用 LIKE 运算符?

@entries1 = Entry.find_by_sql(["SELECT `entries`.name as name FROM `entries` where `entries`.name like '%?%'",@something])

将产生

SELECT `entries`.name as name FROM `entries` where `entries`.name like '%'hello'%'

什么时候@something = 'hello'

4

4 回答 4

3

不要将百分号放在 SQL 中,而是将它们添加到您要注入的变量中(在转义已经存在的百分号/下划线之后!)

"%#{@something.gsub('%', '\%').gsub('_', '\_')}%"
于 2012-11-26T05:59:24.457 回答
2

您可以concat在数据库中使用:

Entry.find_by_sql([
  "SELECT ... `entries`.name like concat('%', ?, '%')",
  @something
])

或者您可以在 Ruby 中添加通配符:

Entry.find_by_sql([
  "SELECT ... `entries`.name like ?",
  "%#{@something}"
])

请注意,其他数据库将希望看到'%' || ? || '%''%' + ? + '%'而不是concat调用。

于 2012-11-26T05:56:21.200 回答
2

@entries1 = Entry.select('name').where('name like ?',"%#{@something}%"])应该做同样的事情

于 2012-11-27T13:38:38.683 回答
1

您需要四个 '%' 围绕搜索值,并且必须在每个前面加上分隔符 '\'。

例如 search_val 可以是“”或“031”等...

find_by_sql([ "select  * from tableX where id like '\%\%#{search_val}\%\%'" ])
于 2017-03-21T20:51:35.997 回答