我有一个Contact
模型。它具有以下属性:first_name
和last_name
。用户使用提示在搜索字段中输入文字:输入联系人的全名。然后,Rails需要找到输入名称的所有联系人记录LIKE
。
这是联系人记录的图片:
- 如果用户输入" JOE"然后rails将返回两个记录(因为它不区分大小写)
- 如果用户输入" joe s"然后rails将返回两条记录
- 如果用户输入" doe"然后rails将返回一条记录。
#models/contact.rb
class Contact < ActiveRecord::Base
scope :by_entered_name, -> (full_name){where("CONCAT('first_name',' ','last_name') LIKE ?", full_name)}
end
在rails控制台中运行Contact.by_entered_name("joe")
时生成的sql:
SELECT "contacts".* FROM "contacts" WHERE (CONCAT('first_name',' ','last_name') LIKE 'joe'
我正在使用mysql,以防细节很重要。但是对于这个示例应用程序,我使用的是sqlite,它会引发语法错误。最重要的是,我将其用于mysql。
更新:有人表示我的问题不明确。我的问题是:
如何正确创建一个用户输入文本的查询,并查找其联合contacts
和first_name
为last_name
的{{1}}所有LIKE
用户?我还需要它不区分大小写。我上面尝试的范围似乎不起作用。
答案 0 :(得分:4)
有一些你不需要的报价。并且您需要参数中的通配符%
。此外,ILIKE需要忽视Postgres的案例。
class Contact < ActiveRecord::Base
scope :by_entered_name, -> (full_name){where("CONCAT(first_name,' ',last_name) ILIKE ?", "%#{full_name}%")}
end
答案 1 :(得分:0)
SQLite不使用CONCAT
函数,它使用||
作为连接运算符。 Swards的回答将让你进入MySQL。