【问题标题】:rails with jquery token-input: first character ignored in search带有jquery token-input的rails:搜索中忽略的第一个字符
【发布时间】:2012-07-31 13:01:35
【问题描述】:

UsersController 的索引:

@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]}%")

可以,但是不行……

帮助表示赞赏!

【问题讨论】:

  • 您使用的是什么数据库?也许(虽然我不知道为什么会发生这种情况,但它违背了我能找到的所有文档)您搜索中的 % 字符与零长度不匹配。这意味着"%J%" 不会匹配以 J 开头的名称,因为它需要在它前面有另一个字符。您的查询是否匹配名称中最后一个字符的字母?
  • 有趣的想法!我正在使用 Postgres。查询成功匹配名称中最后一个字符的字母。
  • 如果你能匹配一个名字的最后一个字母,那么我的建议可能不是问题的原因。但是您可以尝试从 where 子句中删除第一个 %,看看会发生什么。

标签: jquery ruby-on-rails forms jquery-tokeninput


【解决方案1】:

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

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

这个 SO 有很多背景:How do you write a case insensitive query for both MySQL and Postgres?

其他选择:

【讨论】:

  • 成功了 - 谢谢!我还要感谢下面的@davidrac 对#2 的帮助。
【解决方案2】:
  1. 我不确定为什么这不匹配。也许你应该在参数周围添加' ':"first_name like '?'"

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

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

【讨论】:

  • 1 不好 - 把 '' 放在 ?只是根本不让搜索工作。但是,2 效果很好 - 非常感谢! (如果您对 1 有其他想法,请告诉我)
【解决方案3】:

未检测到第一个字母的原因是因为您在 where 语句中的名字和姓氏列前面有一个 %。所以既然J 后面什么都没有,那这就是%John% 不起作用的原因。

您需要同时查找 before 和 after 语句。

这会奏效。

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 作为数据库后端。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多