我正在使用带有Postgresql数据库的Rails构建API。我有一个用户模型,用户表有3列,电子邮件,名称和城市。
我想创建一个允许用户在我的用户模型中搜索多个字段的网址,例如,当用户搜索以下网址时:
http://localhost:3000/search?term=foo
它会在电子邮件,名称和城市列中搜索“foo”字词并返回所有匹配项。这类似于在iTunes Store(http://itunes.apple.com/search?term=foo)上搜索。
到目前为止,这是我的查询:
SELECT
email
name
city
FROM
users
WHERE
email = '#{term}' OR
name = '#{term}' OR
city '#{term}';
这很有效,但是当你有很多记录时,它太慢了(> 4000毫秒)。有没有人知道更好的SQL或Rails / ActiveRecord方法可以使这个查询更好?我已经为所有三列添加了索引。
非常感谢!
答案 0 :(得分:1)
如果您计划将该代码用于生产目的,那么recommended可以使用它吗?在查询字符串中标记,以避免SQL注入。如下例所示:
User.where("email = ? OR name = ? OR city = ?", params[:term], params[:term], params[:term])
你问过如何使事情变得更快,在这种情况下数据库索引可能会有效;所以你需要创建可以称为AddIndexes
的migration fileclass AddIndexes < ActiveRecord::Migration
def change
add_index :users, :email
add_index :users, :name
add_index :users, :city
end
end