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]}%")
会起作用,但它不会......
帮助表示赞赏!
答案 0 :(得分:3)
我打赌你使用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?
其他替代方案:
答案 1 :(得分:1)
我不确定为什么这不匹配。也许您应该在参数' '
"first_name like '?'"
我认为你应该有两个参数:
.where(“first_name like?或last_name like?”,“%#{params [:q]}%”,“%#{params [:q]}%”)
答案 2 :(得分: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])
然后在您的SQL语句中放入UNIQUE,使它们成为唯一的行。
最好使用全文搜索索引来处理这种类型的东西,因为LIKE操作没有为前后操作编制索引(仅限前面)。这假设您使用MySQL作为数据库后端。