Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用单个搜索参数查询Rails和Postgresql中的多个表和列_Ruby On Rails_Postgresql - Fatal编程技术网

Ruby on rails 使用单个搜索参数查询Rails和Postgresql中的多个表和列

Ruby on rails 使用单个搜索参数查询Rails和Postgresql中的多个表和列,ruby-on-rails,postgresql,Ruby On Rails,Postgresql,我正在使用Rails和Postgresql数据库构建一个API。我有一个用户模型,用户表有3列,电子邮件,名称和城市 我想创建一个URL,允许用户在我的用户模型中搜索多个字段,例如,当用户在以下URL中搜索时: http://localhost:3000/search?term=foo 它在电子邮件、姓名和城市列中搜索术语“foo”,并返回所有匹配项。这类似于在iTunes商店中搜索() 到目前为止,我的问题是: SELECT email name city FROM use

我正在使用Rails和Postgresql数据库构建一个API。我有一个用户模型,用户表有3列,电子邮件名称城市

我想创建一个URL,允许用户在我的用户模型中搜索多个字段,例如,当用户在以下URL中搜索时:

http://localhost:3000/search?term=foo
它在电子邮件姓名城市列中搜索术语“foo”,并返回所有匹配项。这类似于在iTunes商店中搜索()

到目前为止,我的问题是:

SELECT 
  email
  name
  city
FROM
  users
WHERE
  email = '#{term}' OR
  name = '#{term}' OR
  city '#{term}';
这是可行的,但当您有很多记录时,速度太慢(>4000ms)。有人知道更好的SQL或Rails/ActiveRecord方法可以使这个查询更好吗?我已经为所有三列添加了索引


非常感谢

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

User.where("email = ? OR name = ? OR city = ?",  params[:term],  params[:term], params[:term])
您询问如何使事情变得更快,在这种情况下,数据库索引可能会起作用;所以您需要创建一个可以称为addIndex的

class AddIndexes < ActiveRecord::Migration
  def change
     add_index :users, :email
     add_index :users, :name
     add_index :users, :city
  end
end
class AddIndexes
非常感谢您提出避免SQL注入的建议。至于添加索引部分,我已经在3列中添加了索引,但是对于一些查询来说仍然很慢(>4000ms)。我在这个表中有大约300万条记录,我想这可能太大了。@HarryWang使用批处理怎么样?我刚刚看了一下(对我来说也是一个新概念!),您可能会发现Rails强制转换也很有用,因此在使用批处理时,您可以使用id或批处理大小限制SQL条件下使用的用户数量。也许这可以加快速度。@HarryWang关于SQL,您还可以向数据库管理员的堆栈交换()询问如何使SQL更快地用于记录批处理。这很有帮助!谢谢!!