使用单个搜索参数在Rails和Postgresql中查询多个表和列

时间:2014-10-22 20:24:59

标签: ruby-on-rails postgresql

我正在使用带有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方法可以使这个查询更好?我已经为所有三列添加了索引。

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果您计划将该代码用于生产目的,那么recommended可以使用它吗?在查询字符串中标记,以避免SQL注入。如下例所示:

User.where("email = ? OR name = ? OR city = ?",  params[:term],  params[:term], params[:term])

你问过如何使事情变得更快,在这种情况下数据库索引可能会有效;所以你需要创建可以称为AddIndexes

migration file
class AddIndexes < ActiveRecord::Migration
  def change
     add_index :users, :email
     add_index :users, :name
     add_index :users, :city
  end
end