我使用以下查询来搜索用户:
@users = User.find( :all,
:select => 'users.*',
:conditions => ["lower(fname) || ' ' || lower(lname) LIKE ?", '%'+"#{params[:q].downcase}"+'%'],
)
这适用于以下示例:
Bob S find Bob Smith
Bob finds Bob Smith
问题是
Bob Smith does not find Bob Smith
如何让上述查询返回完全匹配?谢谢
查询是完全错误的。首先,'||' 不是连接运算符。其次,运算符优先级使其计算为:
(lower(fname)) || (' ') || (lower(lname) LIKE '%Bob Smith%')
这不是你想要的。我想你会喜欢它:
concat(lower(fname), ' ', lower(lname)) LIKE '%Bob Smith%'
编辑:所以你可以使用:
@users = User.find( :all,
:select => 'users.*',
:conditions => ["concat(lower(fname), ' ', lower(lname)) LIKE ?", "%#{params[:q].downcase}%"])
编辑2:以上是错误的,我没有注意到它是关于Postgresql的。当然,Postgres中有一个"||"连接运算符。由于下面的评论,我不会删除这篇文章,但请不要使用它。