使用Rails 3.2。我有下表:
name address
=======================================
Hilton Hotel New York, USA
Hilton Hotel Paris, France
Mandarin Hotel Chicago, USA
Le Meridien Hotel New York, USA
以及以下查询:
term = "%#{params[:term]}%"
shops = Shop.limit(10).where("name LIKE ? OR address like ?", term, term)
我的预期结果如下:
Search - "Hilton"
Result - "Hilton Hotel, New York, USA"; "Hilton Hotel, Paris, France"
Search - "Hilton USA"
Result - "Hilton Hotel, New York, USA"
Search - "New York"
Result - "Hilton Hotel, New York, USA"; "Le Meridien Hotel, New York, USA"
我应该如何重写我的查询?
感谢。
答案 0 :(得分:0)
你可以使用MySQL的MATCH AGAINST。在Rails中没有直接支持,但您始终可以使用
在Rails中滚动自己的自定义查询YourModel.find_by_sql("SELECT ... WHERE MATCH(...) AGAINST(...)")
或更多Rails样式(尚未测试过):
YourModel.where("MATCH(...) AGAINST(...)")
有关详细信息,请查看此处:http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html
修改强> 我按空格,逗号,点等分割输入字符串,然后使用MATCH AGAINST获取所有结果。所以如果你有这个表:
col1 | col2
-----------
row1: a c | a
row2: a d | b e
row3: b e | a d
row4: b | b c
用户输入a
作为输入。你应该做
MATCH(col1, col2) AGAINST ('a')
这将返回:
row1: 'a c', 'a'
row2: 'a d', 'b e'
row3: 'b e', 'a d'
答案 1 :(得分:0)
我为此使用了另一种解决方法。
我创建了另一个列for_autocomplete
并将name
和address
连接到其中。每次创建/更新记录时,它都会相应地创建/更新for_autocomplete
。然后我只搜索for_autocomplete
列。