在Rails范围内使用Concat

时间:2015-11-19 03:51:28

标签: mysql ruby-on-rails ruby

我有一个Contact模型。它具有以下属性:first_namelast_name。用户使用提示在搜索字段中输入文字:输入联系人的全名。然后,Rails需要找到输入名称的所有联系人记录LIKE。 这是联系人记录的图片:

Picture of records within the Contact Table

- 如果用户输入" 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。

更新:有人表示我的问题不明确。我的问题是:

如何正确创建一个用户输入文本的查询,并查找其联合contactsfirst_namelast_name的{​​{1}}所有LIKE用户?我还需要它不区分大小写。我上面尝试的范围似乎不起作用。

2 个答案:

答案 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。