Cla*_*lay 14 activerecord model autocomplete ruby-on-rails
我正在使用rails3-jquery-autocomplete这里找到的宝石:http://github.com/crowdint/rails3-jquery-autocomplete
有关如何查询模型的单个属性的说明很明确,我可以毫无问题地完成这项工作.
但是,我的Person模型有两个属性,我想要组合和查询.他们是first_name和last_name.我想将它们组合成一个名为的伪属性full_name.目前,我收到此错误:
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such column: full_name: SELECT "people".* FROM "people" WHERE (LOWER(full_name) LIKE 'cla%') ORDER BY full_name ASC LIMIT 10):
Run Code Online (Sandbox Code Playgroud)
full_name虽然我在Person模型文件中有以下方法,但是没有Person模型的属性:
def full_name
"#{self.first_name} #{self.last_name}"
end
Run Code Online (Sandbox Code Playgroud)
如何修改Person模型文件以便调用full_name查询数据库以匹配first_name和last_name?的组合?
DGM*_*DGM 10
您的伪属性仅适用于已检索的记录,但它与搜索记录无关.可能最简单的解决方案是命名的命名范围,如:
scope :search_by_name, lambda { |q|
(q ? where(["first_name LIKE ? or last_name LIKE ? or concat(first_name, ' ', last_name) like ?", '%'+ q + '%', '%'+ q + '%','%'+ q + '%' ]) : {})
}
Run Code Online (Sandbox Code Playgroud)
因此,呼叫如:
Person.search_by_name(params[:q])
Run Code Online (Sandbox Code Playgroud)
将返回适当的结果集.如果没有传递param,它也会返回所有条目(或者更具体地说,这个范围不会增加任何额外的东西),使其成为索引操作的简单插入.
可悲的是,上面提到的范围方法对我不起作用.我的解决方案是简单地覆盖get_autocomplete_items方法(以前的get_items).
对于它的价值,有一个MySQL函数(其他数据库也有它,但我们暂时谈论MySQL),它更适合你正在使用的连接类型:
def get_autocomplete_items(parameters)
items = Contact.select("DISTINCT CONCAT_WS(' ', first_name, last_name) AS full_name, first_name, last_name").where(["CONCAT_WS(' ', first_name, last_name) LIKE ?", "%#{parameters[:term]}%"])
end
Run Code Online (Sandbox Code Playgroud)
MySQL的CONCAT_WS()旨在将字符串与某种分隔符连接在一起,是全名的理想选择.
这段代码基本上表示当我们通过串联的名字和姓氏对配对数据库的联系人记录时,返回匹配用户搜索内容的"最后一个"格式化联系人姓名.我觉得它比上面的SQL语句更好,因为它执行完整搜索,它将匹配一个语句中的第一个AND/OR姓氏,而不是三个OR语句.
使用这个"hn sm"将匹配"John Smith",因为"hm sm"确实像"John Smith".此外,它还具有返回每个联系人的连接的名字和姓氏的额外好处.您可能需要完整记录.如果是这种情况,请从上面的行中删除select()查询.我个人需要用户搜索名称并让自动填充字段返回所有可能的匹配,而不是记录.
我知道这有点晚了,但我希望它可以帮助别人!
| 归档时间: |
|
| 查看次数: |
7871 次 |
| 最近记录: |