2

用户控制器的索引:

@users = current_user.other_users.where("first_name like ?", "%#{params[:q]}%")

1) 搜索在文本字段中工作正常,但未检测到第一个字符。

示例:如果我用“J”搜索“John”,我不会得到任何结果,但如果我搜索“o”,我会得到“John”。

2) 我想知道你如何在上面为 last_name 添加一个额外的搜索条件......?我想像

.where("first_name like ? or last_name like ?", "%#{params[:q]}%")

会工作,但它不...

帮助表示赞赏!

4

3 回答 3

3

我打赌您使用 Postgres 作为数据库,其中 LIKE 子句区分大小写。在 Postgres 中搜索不区分大小写:

.where("first_name ILIKE ? or last_name ILIKE ?", "%#{params[:q]}%")

这个 SO 有很多背景:你如何为 MySQL 和 Postgres 编写不区分大小写的查询?

其他选择:

于 2012-08-13T15:37:42.473 回答
1
  1. 我不确定为什么这不匹配。也许你应该' '在参数周围添加:"first_name like '?'"

  2. 我认为你应该在那里有两个参数:

.where("first_name like ? or last_name like ?", "%#{params[:q]}%", "%#{params[:q]}%")

于 2012-08-02T15:47:24.820 回答
0

未检测到第一个字母的原因是因为您在 where 语句中的名字和姓氏列前面有一个 %。因此,既然后面没有任何东西,J那这就是为什么%John%行不通的原因。

您将需要查找之前和之后的语句。

这会奏效。

q1 = params[:q].to_s + '%'
q2 = '%' + q1
where(["first_name LIKE ? OR last_name LIKE ? OR first_name LIKE ? OR last_name LIKE", q1,q1,q2,q2])

然后将 UNIQUE 放入您的 SQL 语句中,以使它们成为唯一的行。

无论如何,最好对这类内容使用全文搜索索引,因为 LIKE 操作没有针对前后操作(仅前面)进行索引。这是假设您使用 MySQL 作为数据库后端。

于 2012-08-13T15:26:21.253 回答